python高階 協程

2021-09-17 01:14:40 字數 3520 閱讀 7810

def

demo1()

:for i in

range(3

):print

('正在執行demo1---{}'

.format

(i))

yield

defdemo2()

:for i in

range(3

):print

('正在執行demo2---{}'

.format

(i))

yield

g1 = demo1(

)g2 = demo2(

)print

(g1)

while

true

:try

:next

(g1)

next

(g2)

except stopiteration:

break

>

正在執行demo1---

0正在執行demo2---

0正在執行demo1---

1正在執行demo2---

1正在執行demo1---

2正在執行demo2---

2

def

******_coroutine()

:print

('轉到協程'

) x =

yield

## 返回到主程序

print

('協程接收到主程序值x:'

.format

(x))

sc = ******_coroutine(

)print

('開始主程序'

)# 可以使用sc.send(none),效果一樣

next

(sc)

## 預激

print

('yield--回到主程序'

)sc.send(

'zhexiao'

)# send呼叫

>開始主程序

轉到協程

yield

--回到主程序

協程接收到主程序值x:zhexiao

stopiteration

from greenlet import greenlet

import time

deftest1()

:while

true

:print

('---a----'

) gr2.switch(

) time.sleep(

0.5)

deftest2()

:while

true

:print

('----b----'

) gr1.switch(

) time.sleep(

0.5)

"""greenlet這個類對yield進行的封裝

"""gr1= greenlet(test1)

gr2 = greenlet(test2)

gr1.switch(

)

import gevent

deff1

(n):

for i in

range

(n):

print

(gevent.getcurrent(

),i)

gevent.sleep(

0.5)

deff2

(n):

for i in

range

(n):

print

(gevent.getcurrent(

),i)

gevent.sleep(

0.5)

deff3

(n):

for i in

range

(n):

print

(gevent.getcurrent(

),i)

#gevent.sleep(0.5)

g1 = gevent.spawn(f1,5)

g2 = gevent.spawn(f2,5)

g3 = gevent.spawn(f3,5)

g1.join(

)g2.join(

)g3.join(

)>

: f1(5)

>

0: f2(5)

>

0: f3(5)

>

0: f3(5)

>

1: f3(5)

>

2: f3(5)

>

3: f3(5)

>

4: f1(5)

>

1: f2(5)

>

1: f1(5)

>

2: f2(5)

>

2: f1(5)

>

3: f2(5)

>

3: f1(5)

>

4: f2(5)

>

4

import gevent

import time

from gevent import monkey

monkey.patch_all(

)def

f1(n)

:for i in

range

(n):

print

(gevent.getcurrent(

),i)

time.sleep(

0.5)

deff2

(n):

for i in

range

(n):

print

(gevent.getcurrent(

),i)

time.sleep(

0.5)

g1 = gevent.spawn(f1,5)

g2 = gevent.spawn(f2,5)

g1.join(

)g2.join(

)>

: f1(5)

>

0: f2(5)

>

0: f1(5)

>

1: f2(5)

>

1: f1(5)

>

2: f2(5)

>

2: f1(5)

>

3: f2(5)

>

3: f1(5)

>

4: f2(5)

>

4

Python 高階 之 協程

協程的概念級描述 與執行緒對比 知乎 鏈結 執行緒有兩個必須要處理的問題 一是碰著阻塞式i o會導致整個程序被掛起 二是由於缺乏時鐘阻塞,程序需要自己擁有排程執行緒的能力。如果一種實現使得每個執行緒需要自己通過呼叫某個方法,主動交出控制權。那麼我們就稱這種執行緒是協作式的,即是協程。在python中...

Python高階之協程詳解

目錄 協程 co routine,又稱微執行緒 是一種多方協同的工作方式。當前執行者在某個時刻主動讓出 yield 控制流,並記住自身當前的狀態,以便在控制流返回時能從上次讓出的位置恢復 resume 執行。簡而言之,協程的核心思想就在於執行者對控制流的 主動讓出 和 恢復 相對於,執行緒此類的 搶...

python協程與非同步協程

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