多线程与多进程

无论是进程还是线程我们都可以循环开启多条,对于什么时候使用进程什么时候使用线程这个问题上:答案就是,我们在遇到计算密集型问题时使用多进程,遇到io密集型问题时使用多线程。

  计算密集型问题:计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

  IO密集型问题:IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。

复制代码
# coding:utf-8

import threading,time

lock = threading.Lock()
ls = [i for i in range(10)] #[1,2,3,4,5,6,7,8,9]

# def getValue():
#     global ls
#     if len(ls):
#         a = ls[-1]
#         print('线程:%s 删除 %s'%(threading.current_thread().name,a))
#         time.sleep(1)
#         ls.remove(a)


def get():
    global ls
    lock.acquire() # 开始上同步锁
    try:
        if len(ls):
            a = ls[-1]
            print('线程:%s 删除 %s' % (threading.current_thread().name, a))
            time.sleep(1)
            ls.remove(a)
    finally:
        lock.release() # 释放同步锁


if __name__=='__main__':
    while True:
        # 开启多线程的方法,我们可以使用循环来开启多线程,及多进程也是如此。
        t = []
        for i in range(1,4):
            t1 = threading.Thread(target=get,name='Thread-%s'%i)
            t.append(t1)
            t1.start()
        # 最后我们循环来等待他们运行结束在执行下面的内容。
        for item in t:
            item.join()

        if len(ls) == 0:
            break
    print(ls)
原文地址:https://www.cnblogs.com/wwthuanyu/p/9971503.html