我们大多数的时候使用多线程,以及多进程,但是python中由于GIL全局解释器锁的原因,python的多线程并没有真的实现
实际上,python在执行多线程的时候,是通过GIL锁,进行上下文切换线程执行,每次真实只有一个线程在运行。所以上边才说,没有真的实现多现程。
那么python的多线程就没有什么用了吗?
不是这个样子的,python多线程一般用于IO密集型的程序,那么什么叫做IO密集型呢,举个例子,比如说带有阻塞的。当前线程阻塞等待其它线程执行。
即然说到适合python多线程的,那么什么样的不适合用python多线程呢?
答案是CPU密集型的,那么什么样的是CPU密集型的呢?百度一下你就知道。
现在有这样一项任务:需要从200W个url中获取数据?
那么我们真心不能用多线程,上下文切换是需要时间的,数据量太大,无法接受。这里我们就要用到多进程+协程
那么什么是协程呢?
协程,又称微线程,纤程。英文名Coroutine。
协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。
协程有什么好处呢,协程只在单线程中执行,不需要cpu进行上下文切换,协程自动完成子程序切换。
这里没有使用yield协程,这个python自带的并不是很完善,至于为什么有待于你去研究了。
这里使用比较完善的第三方协程包gevent
pip install gevent
每个进程下N个协程,
#coding=utf-8 from multiprocessing import Process import gevent #from gevent import monkey; monkey.patch_socket() #用于协程的了程序 def yield_execFunc(x): print('______________%s'%x) #yield_clist决定协程的数量 #开始协程操作 def yield_start(yield_clist): task=[] #用来存储协程 for i in yield_clist: task.append(gevent.spawn(yield_execFunc,i)) gevent.joinall(task) #执行协程 if __name__=="__main__": list1=[1,2,3,4,5,6,7,8,9,10] #元素个数决定开起的协程数量 list2=[1,2,3,4,5,6,7,8,9,10] list3=[1,2,3,4,5,6,7,8,9,10] process_list =[list1,list2,list3] #元素个数决定进程数量 for plist in process_list: p = Process(target=yield_start,args=(plist,)) p.start()
执行结果:开了三个进程,每个进程下执行10个协程协作任务
C:Python27python.exe D:/weixin/temp/yield_tmp.py ______________1 ______________2 ______________3 ______________4 ______________5 ______________6 ______________7 ______________8 ______________9 ______________10 ______________1 ______________1 ______________2 ______________2 ______________3 ______________3 ______________4 ______________4 ______________5 ______________5 ______________6 ______________6 ______________7 ______________7 ______________8 ______________8 ______________9 ______________9 ______________10 ______________10 Process finished with exit code 0