1. 程式人生 > >5.1.25 協程

5.1.25 協程

install 另一個 span stop 自動切換 pro con time() 之間

協程:單線程下的並發。又稱微線程。是用戶態的輕量級線程,即協程是由用戶程序自己控制調度的

要遇到IO才切。

比線程開銷更小。

修改共享數據不用加鎖

yield greenlet都無法做到遇到IO就切換

gevent 可以監控多個任務之間的IO,遇到IO切換到另一個任務。

yield:

#並發執行
import time

def producer():
    g=consumer()
    next(g)
    for i in range(10000000):
        g.send(i)



def consumer():
    while True:
        res=yield
start_time=time.time() producer() stop_time=time.time() print(stop_time-start_time) #串行 import time def producer(): res=[] for i in range(10000000): res.append(i) return res def consumer(res): pass start_time=time.time() res=producer() consumer(res) stop_time=time.time()
print(stop_time-start_time)

Greenlet:

#pip3 install greenlet
from greenlet import greenlet
import time

def eat(name):
    print(%s eat 1 %name)
    #time.sleep(10)   #遇到IO就不會自動切換了
    g2.switch(egon)
    print(%s eat 2 %name)
    g2.switch()

def play(name):
    print(%s play 1 %name )
    g1.switch()
    
print(%s play 2 %name ) g1=greenlet(eat) g2=greenlet(play) g1.switch(egon)

Gevent: 詳見下一節

5.1.25 協程