python協程實現

2022-06-08 06:00:11 字數 1378 閱讀 6505

參考:

協程,又稱微執行緒,纖程。英文名coroutine。

協程是程式級別的,由程式自己決定如何排程。

協程的概念:

在子程式執行過程中可以中斷去執行別的子程式,而別的子程式也可以中斷回來繼續執行之前的子程式,這個過程就稱為協程。

類似與yield操作。

協程的優點:

無需執行緒切換上下文,避免了無意義的排程。可以提高程式效能。

無需原子操作鎖定及同步的開銷

方便切換控制流,簡化程式設計模型

高併發+高擴充套件性+低成本:乙個cpu支援上萬的協程都不是問題。所以很適合用於高併發處理。

協程的缺點:

無法利用多核資源。

進行阻塞(blocking)操作(如io時)會阻塞掉整個程式

用yield實現:

def consumer(name):

count = 12

print('開始吃包子...')

# while true:

bone = 0

while bone <= count:

print('%s需要包子' % name)

bone = yield # 接收send傳送的資料

print('%s吃了%s個包子' % (name, bone))

def producer(obj1):

obj1.send(none) # 必須先傳送none,觸發協程執行

for i in range(3):

print('[producer]正在做%s個包子' % i)

obj1.send(i)

if __name__ == '__main__':

con1 = consumer('消費者a') # 建立消費者物件, 此時程式並未執行,只是返回了乙個生成器物件。

producer(con1)

print("協程結束")

greenlet模組實現程式間切換執行

from greenlet import greenlet

def test1():

print 12

gr2.switch()

print 34

def test2():

print 56

gr1.switch()

print 78

gr1 = greenlet(test1)

gr2 = greenlet(test2)

gr1.switch()

# 輸出為:

#     12 56 34

gevent框架

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...

python 協程實現與總結

我要把5個任務放到乙個執行緒裡面去 能不能發生併發操作 又乙個程序,切換到另乙個程序,由誰來操作的儲存狀態,由作業系統來 單執行緒可以實現併發,用協程 要找到一種解決方案,讓程式設計師應用程式的角度,找到解決方案,能實現執行乙個任務,切換乙個任務,在切換到另乙個任務,在切換之前把狀態儲存下來 單執行...

Python使用gevent實現協程

coding utf8 import requests import gevent from gevent import monkey monkey.patch all 用於將標準庫中大部分阻塞式呼叫修改為協作式執行 def fetch url print get format url respon...