生產者和消費者問題:
當協程呼叫yield時,從乙個懸而未決的resume中返回。
簡單的協程練習:
function receive()local status,value =coroutine.resume(producer)
return
status,value
endfunction send(x)
coroutine.
yield
(x)end
producer =coroutine.create(
function()
local x = 0
while
true
dox = x+1
if(x > 10
) then
break
end send(x)
endend)
local status,res
repeat
status,res =receive()
print(status, res)
until(nil == res)
輸出:>lua -e "io.stdout:setvbuf 'no'" "1.lua"
true 1
true 2
true 3
true 4
true 5
true 6
true 7
true 8
true 9
true 10
true nil
>exit code: 0
這種模式被稱為消費者驅動模式。
過濾器filter是一種位於生產者和消費者之間的處理函式,用於對資料進行變換。它既是乙個生產者又是消費者,他喚醒生產者產生new value,然後又將變換後的值傳給消費者。
表示自己寫的**,出問題了:
function receive(prod)local value =coroutine.resume(prod)
return
value
endfunction send(x)
coroutine.
yield
(x)end
x = 0
function producer()
return
coroutine.create(
function()
x = x + 1
print(sting.format(
"producer:%d.\n
",x))
return
xend)
endfunction filter(prod)
return
coroutine.create(
function()
local x =receive(prod)
x = string.format("
add:%d
",x)
send(x)
end)end
function consumer(prod)
repeat
res =receive(prod)
print(res)
until (nil ==res)
endp =producer()
f =filter(p)
print(x)
consumer(f)
晚上回去看看怎麼回事。
協程巢狀協程
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正在執行乙個任務,會在兩種情況下切走去...
python協程與非同步協程
在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...