1. 程式人生 > >python3 協程

python3 協程

int pat resp 並發 produce tro 應用 turn url

‘‘‘
協程
無切換消耗
實現了並發,並發:並非線程切,而是線程執行的任務的切換,如果直接切換任務,也是並發
缺點:不能利用多核
協程是重點,實現多並發,封裝了很多好模塊,後期應用
‘‘‘

協程基本實現
import time

def consumer():
    r = ‘‘
    while True:
        n = yield r
        print([CONSUMER]<<Consuming %s... %n)
        time.sleep(1)
        r = 200 OK

def produce(c):
    next(c)
    n 
= 0 while n < 5: n = n + 1 print([PRODUCER]>>Producing %s... %n) cr = c.send(n) print([PRODUCER]>>Consumer return: %s % cr) if __name__ == __main__: c = consumer() produce(c)

‘‘‘
greenlet
不常用,只能切任務,但是對IO密集型任務不能節省時間
‘‘‘
from greenlet import
greenlet def test1(): print(12) gr2.switch() print(34) gr2.switch() def test2(): print(56) gr1.switch() print(78) gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch()

‘‘‘
gevent
第三方庫
當一個greenlet遇到IO操作時,比如訪問網絡,就自動切換到其他的greenlet,等到IO操作完成,再在適當的時候切換回來繼續執行
‘‘‘
import requests,gevent,time
from gevent import monkey monkey.patch_all() # 由於切換是在IO操作時自動完成,所以gevent需要修改Python自帶的一些標準庫,這一過程在啟動時通過monkey patch完成 def foo(url): response=requests.get(url) response_str=response.text print("GET data %s"%len(response_str),url) s=time.time() gevent.joinall([gevent.spawn(foo,"https://itk.org/"), gevent.spawn(foo,"https://www.github.com/")]) # gevent.spawn(foo, "https://zhihu.com/")]) print(time.time()-s)

python3 協程