Latest web development tutorials

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
……