Latest web development tutorials

współprogram Lua (współprogram)

Czym jest synergiczne (współprogram)?

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.

Różnica pomiędzy wątkami i współprogram

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.

Podstawowa składnia

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

Poniższy przykład pokazuje zastosowanie każdego z powyższych sposobów:

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

  • Przywracanie połączenia, będzie koordynować wznawiania, wznowienie pracy udany powrót prawdziwego, poza return false;
  • Wspólne biegnie programowe;
  • Uruchom w celu uzyskania oświadczenia;
  • Wydajność zawieszone współprogram powraca pierwsza wznowienia; (Uwaga: powrót o wydajności do wznowienia parametry są parametrami)
  • Po drugie wznowić, ponownie wake up współprogram; (Uwaga: Parametry To CV, oprócz pierwszego argumentu, pozostałe parametry przyniesie jako parametr)
  • powraca plonów;
  • Collaborative Program kontynuuje działanie;
  • Jeśli nadal uruchomić program spółdzielnia wykorzystuje metodę nadal nazywają CV po zakończeniu produkcji: nie można wznowić martwego współprogram

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.


Kwestie konsumenckie - Producent

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