coroutines Lua (coroutine)
อะไรคือการทำงานร่วมกัน (coroutine)?
Lua Coroutines (coroutine) กระทู้ค่อนข้างคล้ายกัน: กองอิสระตัวแปรท้องถิ่นแยกตัวชี้สอนอิสระ แต่ยังได้ร่วมกันตัวแปรทั่วโลกและสิ่งอื่น ๆ มากที่สุดและโปรแกรมอื่น ๆ ที่ทำงานร่วมกัน
Synergy จะมีประสิทธิภาพมาก แต่ยังมีความซับซ้อนมากที่จะใช้
ความแตกต่างระหว่างด้ายและ coroutines
ความแตกต่างที่สำคัญระหว่างด้ายและ coroutines ว่าโปรแกรมมีหลายหัวข้อสามารถทำงานหลายกระทู้พร้อมกันในขณะที่โปรแกรมสหกรณ์จะต้องเกี่ยวกับการทำงานร่วมกันอีก
ในเวลาใดก็ตามมีเพียงหนึ่งโครงการความร่วมมือกำลังทำงานและ coroutine ทำงานเฉพาะจะต้องล้างเวลาที่ถูกระงับจะถูกระงับ
โปรแกรมความร่วมมือค่อนข้างคล้ายกับประสานหลายกระทู้ในหัวข้อเดียวกันรอหลายกระทู้ล็อคการทำงานร่วมกันค่อนข้างคล้าย
ไวยากรณ์พื้นฐาน
ทาง | ลักษณะ |
---|---|
coroutine.create () | สร้าง coroutine กลับ coroutine อาร์กิวเมนต์เป็นฟังก์ชั่นเมื่อใช้ร่วมกับและดำเนินการเมื่อบริการโทรปลุกฟังก์ชั่น |
coroutine.resume () | รีสตาร์ท coroutine และสร้างที่มีการใช้ |
coroutine.yield () | ระงับ coroutine, coroutine เพื่อรอดำเนินการของรัฐและดำเนินการกับการใช้งานในครั้งนี้จะมีจำนวนมากของผลกระทบที่มีประโยชน์ |
coroutine.status () | ตรวจสอบสถานะของ coroutine หมายเหตุ: รัฐ coroutine มีสาม: ตายระงับการทำงานโดยเฉพาะอย่างยิ่งเมื่อมีรัฐดังกล่าวโปรดดูที่ขั้นตอนต่อไป |
coroutine.wrap () | สร้าง coroutine ให้กลับมาทำงานว่าเมื่อคุณเรียกใช้ฟังก์ชันนี้ป้อน coroutine และสร้างฟังก์ชันซ้ำ |
coroutine.running () | ผลตอบแทนที่กำลังทำงาน coroutine เป็น coroutine เป็นด้ายเมื่อทำงานเมื่อด้ายคือการกลับจำนวนของ corouting |
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้งานของแต่ละวิธีการดังกล่าวข้างต้นนี้
-- coroutine_test.lua 文件 co = coroutine.create( function(i) print(i); end ) coroutine.resume(co, 1) -- 1 print(coroutine.status(co)) -- dead print("----------") co = coroutine.wrap( function(i) print(i); end ) co(1) print("----------") co2 = coroutine.create( function() for i=1,10 do print(i) if i == 3 then print(coroutine.status(co2)) --running print(coroutine.running()) --thread:XXXXXX end coroutine.yield() end end ) coroutine.resume(co2) --1 coroutine.resume(co2) --2 coroutine.resume(co2) --3 print(coroutine.status(co2)) -- suspended print(coroutine.running()) print("----------")
ตัวอย่างของการดำเนินงานของการส่งออกดังกล่าวข้างต้นเป็น:
1 dead ---------- 1 ---------- 1 2 3 running thread: 0x7fb801c05868 false suspended thread: 0x7fb801c04c88 true ----------
coroutine.running สามารถมองเห็นการดำเนินงาน coroutine เป็นด้ายที่ด้านล่าง
เมื่อสร้าง coroutine เมื่อเหตุการณ์ที่มีการลงทะเบียนในหัวข้อใหม่
เมื่อมีเหตุการณ์ต่อจะถูกเรียกเมื่อสร้างฟังก์ชั่น coroutine จะถูกดำเนินการและเมื่อต้องเผชิญกับอัตราผลตอบแทนในนามระงับเธรดปัจจุบันต้องรออีกครั้งกลับมาเรียกเหตุการณ์
ต่อไปเราจะวิเคราะห์ตัวอย่างรายละเอียดเพิ่มเติมได้ที่:
function foo (a) print("foo 函数输出", a) return coroutine.yield(2 * a) -- 返回 2*a 的值 end co = coroutine.create(function (a , b) print("第一次协同程序执行输出", a, b) -- co-body 1 10 local r = foo(a + 1) print("第二次协同程序执行输出", r) local r, s = coroutine.yield(a + b, a - b) -- a,b的值为第一次调用协同程序时传入 print("第三次协同程序执行输出", r, s) return b, "结束协同程序" -- b的值为第二次调用协同程序时传入 end) print("main", coroutine.resume(co, 1, 10)) -- true, 4 print("--分割线----") print("main", coroutine.resume(co, "r")) -- true 11 -9 print("---分割线---") print("main", coroutine.resume(co, "x", "y")) -- true 10 end print("---分割线---") print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine print("---分割线---")
ตัวอย่างของการดำเนินงานของการส่งออกดังกล่าวข้างต้นเป็น:
第一次协同程序执行输出 1 10 foo 函数输出 2 main true 4 --分割线---- 第二次协同程序执行输出 r main true 11 -9 ---分割线--- 第三次协同程序执行输出 x y main true 10 结束协同程序 ---分割线--- main false cannot resume dead coroutine ---分割线---
ตัวอย่างเอาไปเป็นดังนี้
- โทรกลับมาจะได้ประสานงานปลุก, ทำงานต่อแล้วกลับประสบความสำเร็จที่แท้จริงมิฉะนั้นกลับเท็จ;
- โปรแกรมวิ่งร่วมมือ;
- เรียกให้ผลผลิตงบ;
- อัตราผลตอบแทนระงับ coroutine ผลตอบแทน Resume แรก (หมายเหตุ: ผลตอบแทนอัตราผลตอบแทนที่นี่เพื่อดำเนินการต่อพารามิเตอร์พารามิเตอร์)
- ประวัติส่วนตัวที่สองตื่นขึ้นมาอีกครั้ง Coroutines; (หมายเหตุ: พารามิเตอร์ประวัตินี้นอกเหนือไปจากอาร์กิวเมนต์แรกพารามิเตอร์ที่เหลือจะให้ผลผลิตเป็นพารามิเตอร์)
- ผลตอบแทนที่ได้ผลผลิต;
- โปรแกรมการทำงานร่วมกันยังทำงานต่อไป;
- หากคุณยังคงเรียกใช้โปรแกรมสหกรณ์ใช้วิธีการอย่างต่อเนื่องที่จะเรียกทำงานต่อหลังจากความสำเร็จของการส่งออก: ไม่สามารถดำเนินการต่อ coroutine ตาย
พลังของสถานที่ที่มีประวัติการทำงานที่และอัตราผลตอบแทนกลับมาในโปรแกรมหลักก็จะเป็นนอกรัฐ (ข้อมูล) ส่งผ่านไปยังขั้นตอนการประสานงานภายในและจะให้ผลผลิตรัฐภายใน (ข้อมูล) กลับไปที่กระบวนการหลัก
ปัญหาของผู้บริโภค - ผู้ผลิต
ผู้บริโภคของปัญหาคลาสสิกนี้ - ตอนนี้ฉันจะเสร็จสิ้นการผลิตใช้ coroutines Lua
local newProductor function productor() local i = 0 while true do i = i + 1 send(i) -- 将生产的物品发送给消费者 end end function consumer() while true do local i = receive() -- 从生产者那里得到物品 print(i) end end function receive() local status, value = coroutine.resume(newProductor) return value end function send(x) coroutine.yield(x) -- x表示需要发送的值,值返回以后,就挂起该协同程序 end -- 启动程序 newProductor = coroutine.create(productor) consumer()
ตัวอย่างของการดำเนินงานของการส่งออกดังกล่าวข้างต้นเป็น:
1 2 3 4 5 6 7 8 9 10 11 12 13 ……