Najlepszy samouczek współprogram Lua (współprogram) W 2024 r. W tym samouczku możesz dowiedzieć się Czym jest synergiczne (współprogram)?,Kwestie konsumenckie - Producent,
Lua współprogram (współprogram) Temat stosunkowo podobne: niezależny stos, zmienne lokalne oddzielne, niezależne wskaźnik instrukcji, ale także wspólne zmienne globalne, a większość innych rzeczy i innych programów współpracy.
Synergia jest bardzo silny, ale również bardzo skomplikowane w użyciu.
Główną różnicą pomiędzy wątkami i współprogram że program ma wiele wątków można uruchomić kilka wątków jednocześnie, natomiast spółdzielnia Program musiałby o kolejnej współpracy.
W każdej chwili istnieje tylko jedna spółdzielnia program jest uruchomiony i działa współprogram być wymagane tylko wyczyścić czas zawieszone zostanie zawieszone.
Program współpracy nieco podobny do synchronizacji wielu wątków w tym samym wątku oczekiwania na blokady kilku wątków nieco podobny do współpracy.
sposób | opis |
---|---|
coroutine.create () | Tworzenie współprogram, powrót współprogram argument jest funkcją, gdy używany w połączeniu z, i wznowić, gdy wywołania funkcji budzenie |
coroutine.resume () | Ponowne uruchomienie współprogram i utworzyć z wykorzystaniem |
coroutine.yield () | Zawieszony współprogram, The współprogram do czasu stanu i wznowić z wykorzystaniem tego mieć wiele przydatnych efektu |
coroutine.status () | Sprawdź status współprogram UWAGA: stan współprogram, istnieją trzy: dead, zawiesić, bieganie, zwłaszcza gdy istnieje taki stan, należy odnieść się do następujących procedur |
coroutine.wrap () | Tworzenie współprogram zwraca funkcja, która po wywołaniu tej funkcji, należy wprowadzić współprogram i utworzyć funkcję powtarzania |
coroutine.running () | Zwroty są uruchomione współprogram, A współprogram jest wątek, gdy uruchomiony, gdy wątek jest powrót szereg 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("----------")
Przykłady realizacji powyższego przykładu jest:
1 dead ---------- 1 ---------- 1 2 3 running thread: 0x7fb801c05868 false suspended thread: 0x7fb801c04c88 true ----------
coroutine.running widać współprogram wykonania jest gwint w dolnej części.
Podczas tworzenia współprogram gdy zdarzenie jest rejestrowane w nowym wątku.
Gdy zdarzenie CV jest wyzwalany, gdy utworzyć współprogram funkcja jest wykonywana, a gdy wychodził z wydajnością w imieniu zawiesza bieżący wątek czekać ponownie wznowić wyzwolenie zdarzenia.
Następnie analizujemy bardziej szczegółowy przykład:
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("---分割线---")
Przykłady realizacji powyższego przykładu jest:
第一次协同程序执行输出 1 10 foo 函数输出 2 main true 4 --分割线---- 第二次协同程序执行输出 r main true 11 -9 ---分割线--- 第三次协同程序执行输出 x y main true 10 结束协同程序 ---分割线--- main false cannot resume dead coroutine ---分割线---
Przykłady przejął w następujący sposób:
Moc miejscu z tym CV, CV i wydajnością w programie głównym, to będzie poza stanem (dane) przekazane do wewnętrznych procedur koordynacji oraz przyniesie wewnętrznego państwa (dane) powraca do głównego procesu.
Konsumenci tego klasycznego problemu - będę teraz zakończyć producenci używać współprogram 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()
Przykłady realizacji powyższego przykładu jest:
1 2 3 4 5 6 7 8 9 10 11 12 13 ……