Kavramlar - Coroutineler

Coroutineler ve Threadler

Lua çok iş parçacıklı (multi-threaded) değildir.

Ancak, coroutine'leri kullanarak çok iş parçacıklı bir davranışı taklit ederiz. Bir coroutine, kendine ait bir yürütme akışına sahip olması bakımından bir thread'e (iş parçacığına) benzer. Coroutine'ler işbirlikçi bir yapıda çalışır; bu da, aynı anda sadece bir tanesi çalışabilse de, diğerlerinin çalışmasına izin vermek için bu "thread'leri" (iş parçacıklarını) yürütme sırasında duraklatabildiğimiz anlamına gelir.

Lua'da bir coroutine oluşturulduğunda geri döndürülen değer thread'lerdir. Bunların özellikleri veya üye fonksiyonları yoktur, ancak hangi coroutine'in yeniden yürütülmeye başlayacağını bildirmek için thread nesneleri coroutine.resume'e iletilir.

Temel Kavramlar

Lua, coroutine işlevselliğini coroutine tablosu aracılığıyla sağlar. Argüman olarak bir fonksiyon alan coroutine.create kullanarak bir coroutine oluşturabilirsiniz. Bu, yeni coroutine'i temsil eden thread türünde bir değer döndürür:

co = coroutine.create( function() print( "hi" ) end ) print( co ) --> thread: 0x8071d98

Bir coroutine oluşturulduğunda, askıya alınmış (suspended) durumda başlar:

print( coroutine.status(co) ) --> suspended

Bir coroutine'i başlatmak (veya devam ettirmek) için coroutine.resume kullanın. Bu, durumunu askıya alınmış (suspended) durumdan çalışan (running) duruma değiştirir:

coroutine.resume(co) --> hi

Çalışması bittikten sonra durumu ölü (dead) hale gelir:

print( coroutine.status(co) ) --> dead

Akışı Devretme (Yielding)

Coroutine'ler, yürütmelerini duraklatan ve daha sonra devam ettirilmelerine olanak tanıyan coroutine.yield ile kullanışlı hale gelir.

co = coroutine.create( function() for i = 1, 10 do print( "co", i ) coroutine.yield() end end)

Şimdi, coroutine'i devam ettirmek, onu her seferinde bir yineleme ilerletir:

coroutine.resume(co) --> co 1 print( coroutine.status(co) ) --> suspended coroutine.resume(co) --> co 2 coroutine.resume(co) --> co 3 -- ... coroutine.resume(co) --> co 10 coroutine.resume(co) -- bir şey yapmaz (coroutine artık ölü durumda)

Ölü bir coroutine'i devam ettirmeye çalışmak bir hatayla sonuçlanır:

print( coroutine.resume(co) ) -- Çıktı: false cannot resume dead coroutine

resume ve yield Arasında Değer Aktarımı

Coroutine'ler, onları devam ettiren kodla veri alışverişi yapabilir:

Coroutine'e argüman geçirme:

co = coroutine.create( function(a, b, c) print( "co", a, b, c ) end) coroutine.resume( co, 1, 2, 3 ) --> co 1 2 3

yield'den dönüş değerleri alma:

co = coroutine.create( function(a, b) coroutine.yield( a + b, a - b ) end) print( coroutine.resume(co, 20, 10) ) --> true 30 10

Askıya alınmış bir coroutine'e değer gönderme:

co = coroutine.create( function() print( "co", coroutine.yield() ) end) coroutine.resume(co) -- başlar, yield'e takılır coroutine.resume(co, 4, 5) --> co 4 5

Coroutine fonksiyonundan değer döndürme:

co = coroutine.create( function() return 6, 7 end) print( coroutine.resume(co) ) --> true 6 7

Ek Kaynaklar

Lua Wiki Coroutines Tutorial

Online Lua Manual Coroutines Chapter

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord