python进阶(二) 多进程+协程

    咱们大多数的时候使用多线程,以及多进程,可是python中因为GIL全局解释器锁的缘由,python的多线程并无真的实现python

      实际上,python在执行多线程的时候,是经过GIL锁,进行上下文切换线程执行,每次真实只有一个线程在运行。因此上边才说,没有真的实现多现程。多线程

      那么python的多线程就没有什么用了吗?app

              不是这个样子的,python多线程通常用于IO密集型的程序,那么什么叫作IO密集型呢,举个例子,好比说带有阻塞的。当前线程阻塞等待其它线程执行。socket

      即然说到适合python多线程的,那么什么样的不适合用python多线程呢?url

              答案是CPU密集型的,那么什么样的是CPU密集型的呢?百度一下你就知道。spa

      

       如今有这样一项任务:须要从200W个url中获取数据?线程

       那么咱们真心不能用多线程,上下文切换是须要时间的,数据量太大,没法接受。这里咱们就要用到多进程+协程code

      那么什么是协程呢?协程

      协程,又称微线程,纤程。英文名Coroutine。blog

      协程的概念很早就提出来了,但直到最近几年才在某些语言(如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:\Python27\python.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
相关文章
相关标签/搜索