coroutine

แสดงที่เลิกใช้งานแล้ว

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

coroutine ใช้เพื่อประสานงานหลายอันในเวลาเดียวกันจากภายในสคริปเดียวกัน เช่น การผลิตค่าจากการป้อนข้อมูล หรือการปฏิบัติงานบนสายพานในขณะที่แ

การใช้งาน Coroutines

สามารถสร้างคู่มือใหม่โดยการให้ฟังชันให้กับ coroutine.create() เมื่


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() เพื่อตรวจสอบสถานะของมัน:


<tbody>
<tr>
<td><b>รอดชีวิต</b></td> <td>คอรูตินกำลังรอที่จะเริ่มต้นขึ้นอีก คอรูตินเริ่มในสถานะนี้และเข้าสู่มันเมื่อฟังก์ชันของพวกเขาเรียก <code>coroutine.yield()</code></td>
</tr>
<tr>
<td><b>วิ่ง</b></td>
<td>coroutine กำลังทำงานในขณะนี้</td>
</tr>
<tr>
<td><b>ปกติ</b></td> <td>coroutine กำลังรอผลการทำงานของ coroutine อื่น; ในคำอื่น, มันได้เริ่ม coroutine อื่น.</td>
</tr>
<tr>
<td><b>ตาย</b></td> <td>ฟังก์ชันถูกหยุด (กลับมาหรือโยนข้อผิดพลาด) ไม่สามารถใช้รูปแบบ coroutine ต่อไปได้</td>
</tr>
</tbody>
สถานะหมายถึง

การหุ้ม Coroutines

เมื่อทำงานกับ coroutines คุณยังสามารถละทิ้งการใช้งานของ coroutine และใช้งานรูปแบบของตัวอุปกรณ์เท่านั้น เช่นรูปแบบของตัวอุปกรณ์จะดำเนินการต่อเมื่อเรียกและจะกลับมาเท่านั้นสิ่งที่น


-- สร้าง coroutine และกลับรุ่นตัวอักษรที่รวมมัน
local f = coroutine.wrap(task)
-- รวมคอรูตูนเหมือนว่าเราเรียกคอรูตูน.resume()
local result = f()
-- หากเกิดข้อผิดพลาดมันจะถูกเรียกขึ้นที่นี่!
-- This differs from coroutine.resume() which acts similar to pcall()

ค่าแรกที่กลับมาจาก coroutine.resume() อธิบายว่าว่าคู่มือจะทำงานโดยไม่มีข้อผิดพลาดหรือไม่ อย่างไรก็ตาม ฟังก์ชันที่กลับมาโดย

ตัวอย่างรูปแบบผู้ผลิต

จินตนาการภารกิจที่ผลิตซ้ำของคำ: แต่ละครั้งที่ผลิตซ้ำจะผลิตอีกครั้ง ตัวอย่างเช่นการให้ Hello จะผลิต Hello ต่อไป, HelloHello</


-- ฟังก์ชันนี้ทำซ้ำคำทุกครั้งที่คู่มือการประมวลผลของมันจะเริ่มขึ้นอีก
local function repeatThis(word)
local repetition = ""
while true do
-- ผลการค้นหา
repetition = repetition .. word
coroutine.yield(repetition)
end
end

เพื่อดำเนินการฟังก์ชันนี้ในฐานะ coroutine คุณสามารถใช้ coroutine.create() ต่อด้วยการโทรหาหลายครั้งไปยัง coroutine.resume() :


local repetitionCoro = coroutine.create(repeatThis)
print(coroutine.resume(repetitionCoro, "Hello")) -- ใช่, สวัสดี
print(coroutine.resume(repetitionCoro)) -- ใช่, สวัสดี
print(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello

สำหรับผลิตภัณฑ์นี้คุณยังสามารถใช้ coroutine.wrap() เพื่อรับฟังก์ชันที่ผลิตมูลค่า:


local f = coroutine.wrap(repeatThis)
print(f("Hello")) -- สวัสดี
print(f()) -- สวัสดี
print(f()) -- HelloHelloHello

สรุป

ฟังก์ชัน

  • close(co : coroutine):bool,Variant<string, void>

    ปิดและใส่ coroutine ที่จัดหาในสถานะตาย

  • สร้าง coroutine ใหม่ด้วย body f. f ต้องเป็น Lua ฟังก์ชัน

  • กลับ true หากครอบครองหน้านี้จะสามารถผลิตได้อย่างปลอดภัย

  • resume(co : coroutine,... : Variant):bool,Variant<Tuple, string>

    เริ่มหรือดำเนินการต่อการประมวลผลของ coroutine co

  • กลับ coroutine ที่วิ่งอยู่

  • กลับสถานะของ coroutine co เป็นสตริง

  • สร้างรูปแบบใหม่และส่งคืนฟังก์ชันที่เมื่อเรียกจะดำเนินการรูปแบบใหม่

  • yield(... : Tuple):Tuple<Variant>

    รอดำเนินการของ coroutine

ฟังก์ชัน

close

ปิดและใส่ coroutine ที่ให้ในสถานะตาย ฟังก์ชันนี้กลับมา true ยกเว้น coroutine อยู่ในสถานะผิดพลาดในกรณีที่ครอบครองไม่ได้ปิดการใช้งาน ในกรณีนี้จะกลับมา false และข

พารามิเตอร์

ส่งค่ากลับ

true ยกเว้นว่า coroutine กำลังปิดอยู่ในสถานะข้อผิดพลาด

Variant<string, void>

ข้อความผิดพลาดหากมี

create

สร้าง coroutine ใหม่ด้วย body f. f ต้องเป็น Lua ฟังก์ชัน

พารามิเตอร์

ส่งค่ากลับ

isyieldable

กลับ true หากครอบครองตัวนี้ถูกเรียกภายในสามารถสร้างได้อย่างปลอดภัย การสร้างครอบครองภายใน metamethods หรือ C ฟังก์ชันเป็นสิ่งห้ามหากยกเว้น pcall และ xpcall

ส่งค่ากลับ

ว่าจะให้คอรูตูนนี้ปลอดภัยหรือไม่ในขณะนี้

resume

เริ่มต้นหรือดำเนินการต่อการประมวลผลของ coroutine co ครั้งแรกเมื่อคุณเริ่มรับใช้ coroutine คุณจ

พารามิเตอร์

...: Variant

ส่งค่ากลับ

Variant<Tuple, string>

running

กลับ coroutine ที่วิ่งอยู่

ส่งค่ากลับ

status

กลับสถานะของ coroutine co เป็นสตริง: 'การประมวลผล', หาก coroutine กำลังประมวลผล (ซึ่งเรียกว่าสถานะ); 'รอดำรงตำแหน่ง' หาก coroutine รอดำรงตำแหน่งในการดำเนินการนำเ

พารามิเตอร์

ส่งค่ากลับ

สร้างรูปแบบการทำงานใหม่ที่มีตัวอักษร f ต้องเป็น Lua ตัวอักษร f ต้องเป็นตัวอักษร Lua ที่สร้างขึ้น กลับรูปแบบการทำงานที่สร้างขึ้นทุกครั้งที่มันถูกเรียก ตัวอักษรที่ผ่านไป

พารามิเตอร์

ส่งค่ากลับ

yield

Tuple<Variant>

รอดำรงอยู่ระหว่างการประมวลผลของ coroutine อะไรก็ตามที่เป็นตัวแปรที่จะนำมาใช้จะถูกส่งเป็นผลลัพธ์พิเศษเพื่อดำเนินการต่อ การนำ coroutine ภายใน metamethods หรือ C ฟังก์ชันเป็นไปตามที่อนุญาต

พารามิเตอร์

...: Tuple

ส่งค่ากลับ

Tuple<Variant>