Lua協同程序(coroutine)

協同程序和線程差不多,也就是一條執行序列,擁有自己獨立的棧、局部變量和指針, 同時又與其他協同程序共享全局變量和其他大部分東西。
 
與線程區別:一個具有多個線程的程序可以同時運行幾個線程,而協同程序卻需要彼此協作地運行。
就是說一個具有多個協同程序的程序在任意時刻只能和運行一個協同程序,並且正在運行的協同程序只會在顯示地要求掛起(suspend)時,它的執行纔會暫停。
 
  1. 協同程序基礎
Lua將所有關於協同程序的函數放置在一個名爲"coroutine"的table中。 函數create用於創建新的協同程序, 它只有一個參數,就是一個函數。該函數代碼就是協同程序所需執行的內容。 create會返回一個thread類型的值, 用以表示新的協同程序。 通常create的參數是一個匿名函數。
例如:
co = coroutine .create(function () print("hi") end)
print( co ) --> thread: 0x8071d98
 
一個協同程序可以處於四種不同的狀態:
  • 掛起(suspended)
  • 運行(running)
  • 死亡(dead)
  • 正常(normal)
 
當創建一個協同程序的時,它處於掛起狀態。 也就是說協同程序不會在創建它時,自動執行其內容。
可以通過status來檢查協同程序的狀態
print("coroutine.status(co)) --> suspended
函數coroutine.resume用於啓動或再次啓動一個協同程序的執行,並將其狀態改爲運行:
coroutine.resume(co) --> hi
在本例中,協同程序內容只是簡單地打印了"hi"後便終止了, 然後它就處於死亡狀態。也就再也無法返回。
print("coroutine.status(co)) -->dead
 
Lua協同程序還具有意向有用的機制,就是可以通過一對resume-yield來交換數據。
在第一次調用resume時, 並沒有對應的yield來等待它, 因此所有傳遞給resume的額外參數都將視爲協同程序主函數的參數。
co = coroutine.create(function(a, b, c)
print("co", a, b, c)
end)
coroutine.resume(co, 1, 2, 3) --> co 1 2 3
 
Lua提供的是一種“非對稱的協同程序(symmetric coroutine)"。也就是說Lua提供了兩個函數來控制協同程序的執行, 一個用於掛起執行,一個用於恢復執行。
而其他語言則提供了“對稱的協同程序(symmetric coroutine)", 其中只有一個函數用於轉讓協同程序之間的執行權。
  1. 管道(pipe)
  2. 過濾器(filter)
  3. 非搶佔式的多線程
require "socket"
host = "www.w3.org"
file = "/TR/REC-html32.html"
打開一個TCP連接,連接到該站點的80端口
c = assert (socket.connect(host, 80)
這步操作將返回一個連接對象,可以用它來發送文件請求。
c: = send("GET" .. file .. " HTTP/1.0\r\n\r\n")
while true do
local s, status, partial = c:receive(2^10)
io.write(s or partial)
if status== “closed" then break end
end
c:close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章