yield實現多工演示

2021-10-24 08:53:11 字數 2492 閱讀 9676

import time

deftask1()

:"""任務1函式"""

i =0while

true

:print

("-----in task1-----"

) time.sleep(1)

# 主程式中通過next()拿到yield後面的值

# 生成器物件.send(「傳送的資料」),這時傳送的資料傳遞到yield,當做yield的返回值

result =

yield i

if result ==

"stop"

:# 函式返回時,會丟擲stopiteration異常

# return後的結果就是stopiteration異常的詳情資訊

return

"execute task1 done"

# 模擬生成器中的計算

i +=

1def

task2()

:"""任務2函式"""

i =100while

true

:print

("------in task2------"

) time.sleep(1)

# 主程式中通過next()拿到yield後面的值

# 生成器物件.send(「傳送的資料」),這時傳送的資料傳遞到yield,當做yield的返回值

result =

yield i

if result ==

"stop_stop"

:# 函式返回時,會丟擲stopiteration異常

# return後的結果就是stopiteration異常的詳情資訊

return

"execute task2 done"

# 模擬生成器中的計算

i +=

2if __name__ ==

'__main__'

:# 函式中有yield,此時拿到的是生成器物件

task_1 = task1(

) task_2 = task2(

)# 任務停止執行的標誌位

stop_task1 =

false

stop_task2 =

false

# 迴圈次數記錄

i =0while

true

:# 當主程式迴圈到第四次要開始時

if i ==3:

try:

# 給生成器傳遞引數

task_1.send(

"stop"

)# 捕獲生成器停止執行的訊號,生成器中return的結果就是stopiteration異常的詳情資訊

except stopiteration as task_1_return_info:

# execute task1 done

# 接收到task1()函式的返回值

print

(task_1_return_info)

stop_task1 =

true

# 當任務1沒有停止執行時

ifnot stop_task1:

# 生成器返回結果給主程式

# 獲取yield後面跟的值,此時函式中的**會暫停

result_1 =

next

(task_1)

print

("-----in main get value from task_1 is [{}]---------"

.format

(result_1)

)# 當任務2沒有停止執行時

ifnot stop_task2:

# 獲取yield後面跟的值,此時函式中的**會暫停

result_2 =

next

(task_2)

print

("-----in main get value from task_2 is [{}]---------"

.format

(result_2)

)# 當生成器【任務2】拿到的值是120時

if result_2 ==

120:

try:

# 給生成器傳遞引數

task_2.send(

"stop_stop"

)# 捕獲生成器停止執行的訊號,生成器中return的結果就是stopiteration異常的詳情資訊

except stopiteration as task_2_return_info:

print

(task_2_return_info)

stop_task2 =

true

# 退出while迴圈

break

# while迴圈次數+1

yield完成多工

使用yield完成多工 import time def task1 while true print 1 time.sleep 0.1 yield def task2 while true print 2 time.sleep 0.1 yield def main t1 task1 t2 task2...

實現多工

多工介紹 簡單來說就是作業系統可以同時執行過個任務 單核cpu作業系統會讓各個任務交替執行 真正的多工只能在多核cpu上實現,也就是並行和併發2 併發 併發 指的是任務數多於cpu核數,通過作業系統的各種任務排程演算法,實現用多個任務 一起 執行 實際上總有一些任務不在執行,因為切換任務的速度相當快...

Python 多工之協程(3)實現多工

學習理解迭代器和生成器之後,開始使用協程來實現多工 當乙個函式中包含yield關鍵字,那麼這個函式就不再是乙個普通的函式,它的返回值是乙個生成器物件。我們可以使用next 或send 函式來啟動喚醒生成器物件,當程式第一次執行到yield時,程式暫停執行,並返回yield後邊跟的變數,當再次喚醒時,...