一個 競爭線程 用於在同一個腳指令碼內同時執行多個任務。這些任務可能包括從輸入產生值或在解決較大問題時執行子程序的工作。任務甚至不需要有定義的結束點,但它需要定義特定時間,在那裡它 產生 (暫停)讓其他事情被處理。
使用回合線程
新的核心子程序可以通過提供函數給 coroutine.create() 來創建。一旦創建,回合線程不會在第一次呼叫 coroutine.resume() 傳遞參數給函數之前開始運行。當函數停止或呼叫 coroutine.yield() 時,此呼叫會返回;當這發生時,coroutine.resume() 會返回函數所返回的值、傳送到 coroutine.yield() 的值或錯誤訊息。如果發生錯誤,第二個返回值是投擲的錯誤。
local function task(...)
-- 這個功能可能會為一點工作,然後產生一些值
coroutine.yield("first") -- 由 coroutine.resume() 返回
-- 函數會在被再次中斷後繼續執行
return "second"
end
local taskCoro = coroutine.create(task)
-- 第一次呼叫恢復,會從一開始執行功能
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> 真的,第一個(任務稱為 coroutine.yield())
-- 繼續運行功能,直到它輸出或停止
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
在 coroutine 的生命週期期間,您可以呼叫 coroutine.status() 來檢查其狀態:
<th>意義</th></tr></thead><tbody><tr><td><b>已停用</b></td><td>回合線正在等待被恢復。回合線在此狀態開始,並在其函數呼叫 <code>coroutine.yield()</code> 時進入。</td></tr><tr><td><b>運行中</b></td><td>腳本現在正在運行。</td></tr><tr><td><b>正常</b></td><td>腳本正在等待另一個腳本的產出;換言之,它已經重新啟動了另一個腳本。</td></tr><tr><td><b>死亡</b></td><td>功能已停止(返回或投擲錯誤)。此後無法使用並行運作。</td></tr></tbody>
狀態 |
---|
包裝回合順序
當使用腳本時,您也可以放棄使用腳本對象,而使用包裝函數。這樣的包裝函數會在呼叫時恢復特定的並行作業,並只會返回已獲得的值。您可以使用 coroutine.wrap() 來執行此操作:
-- 創建任務並返回將它重新啟動的包裝函數local f = coroutine.wrap(task)-- 如果我們呼叫 coroutine.resume() 一樣,繼續呼叫 coroutinelocal result = f()-- 如果發生錯誤,將在此處提出!-- This differs from coroutine.resume() which acts similar to pcall()
從 coroutine.resume() 返回的第一個值描述是否有錯誤發生的 coroutine 運行。然而,由 coroutine.wrap() 返回的功能不會這麼做:相反,它們會直接返回傳回或傳給 coroutine.yield() 的值,如果有。如果在執行核心功能時發生錯誤,錯誤將在返回的函數的呼叫上提出。
生產者模式範例
想像一個任務,會產生一個單詞的重複:每次產生重複,下一個任務將產生一個更多。例如,提供 Hello 將產生 Hello , HelloHello , HelloHelloHello 等。要執行此操作,您可以定義 repeatThis() :
-- 此功能每次其並行線程被重新啟動時重複一個字詞
local function repeatThis(word)
local repetition = ""
while true do
-- 進行一次重複,然後獲得結果
repetition = repetition .. word
coroutine.yield(repetition)
end
end
若要以任務為執行此功能,您可以使用 coroutine.create() 之後進行多次呼叫 coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- 真的,你好print(coroutine.resume(repetitionCoro)) -- 真的,HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
對於這個生產者函數,您也可以使用 coroutine.wrap() 來獲得產生值的函數:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- 你好print(f()) -- 你好你好print(f()) -- HelloHelloHello
概要
函式
關閉並將提供的子程序置於死狀態。
創建一個新的 coroutine,其體必須是 Luau 函數。
返回 true 如果在可安全生產的情況下呼叫此函數的子程序,它將返回。
開始或繼續執行 coroutine co 。
返回運行中的子程序。
返回 coroutine 的狀態作為字串。
創建一個新的子程序並返回一個函數,當呼叫時會恢復子程序。
暫停執行核心子程序。