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後邊跟的變數,當再次喚醒時,...