Python yield協程 gevent的理解

2021-10-23 04:22:42 字數 1520 閱讀 8864

如:

import time

defa()

:for i in

range(10

):yield

time.sleep(1)

defb()

:for i in

range(10

):yield

time.sleep(1)

a1 = a(

)b1 = b(

)while1:

next

(a1)

next

(b1)

由於yield的可以暫停函式的執行,也可以重新執行函式的特殊性,可以實現協程

首先獲取所有的函式,也就是協程函式,

然後通過while 函式對各個協程進行輪流呼叫,由於函式中有yield,當執行到耗時操作的時候,我們進行yield返回暫停這個函式, 如果while迴圈就呼叫下乙個協程,當下乙個協程也遇到耗時操作的時候就yield一下停止函式的執行,當每個協程都遇到耗時操作的時候,while迴圈執行第二次,這時候,第乙個協程進行耗時操作,進行完遇到耗時操作的時候再yield,就這樣,不停的輪詢實現協程

gevent

gevent 是python中的乙個協程模組,可以使用gevent.aswpt(協程函式)來建立乙個協程,使用gevent 中的 monkey 補丁可以在協程遇到io 操作堵塞的時候自動的切換到其他的協程中去

import gevent

import requests

from gevent import monkey

# 使用mokey.patch_all() 當協程遇到堵塞的時候會自動的切換到其他協程中去

monkey.patch_all(

)defa1(

):for i in

range

(100):

print

("這是a1的輸出結果"

, i)

# 此時的requests.get 會遇到io操作

requests.get(

"")# gevent.sleep(2)

defa2()

:for i in

range

(100):

print

("這是a2的輸出結果"

, i)

requests.get(

"")# gevent.sleep(2)

defa3()

:for i in

range

(100):

print

("這是a3的輸出結果"

, i)

requests.get(

"")# gevent.sleep(2)

# 開啟協程並讓主線程等待協程

genve.joinall(

[gevent.spawn(a1)

,gevent.spawn(a2)

,gevent.spawn(a3)

])

Python yield 與 send 實現協程

我們來看看在函式內部含有yield語句達到的效果。首先,我們來看看以下 def foo while true x yield print value x g foo g是乙個生成器 next g 程式執行到yield就停住了,等待下乙個next g.send 1 我們給yield傳送值1,然後這個值...

協程巢狀協程

import asyncio import functools 第三層協程 async def test1 print 我是test1 await asyncio.sleep 1 print test1已經睡了1秒 await asyncio.sleep 3 print test1又睡了3秒 ret...

9 協程 協程理論

本節的主題是基於單執行緒來實現併發,即只用乙個主線程 很明顯可利用的cpu只有乙個 情況下實現併發,為此我們需要先回顧下併發的本質 切換 儲存狀態 ps 在介紹程序理論時,提及程序的三種執行狀態,而執行緒才是執行單位,所以也可以將上圖理解為執行緒的三種狀態cpu正在執行乙個任務,會在兩種情況下切走去...