python3 協程
阿新 • • 發佈:2017-07-23
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 協程