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