Coroutine Oluşturma
coroutine.create ve coroutine.wrap ile coroutine'ler oluşturun.
Coroutine Oluşturma, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.
Coroutine Nedir?
Coroutine, yürütmesini duraklatabilen (yield) ve daha sonra kaldığı yerden sürdürebilen bir işlevdir. İş parçacıklarının aksine coroutine'ler işbirlikçidir; aynı anda yalnızca biri çalışır ve denetimi açıkça bırakırlar. Lua coroutine'lerinin kendilerine ait yığını ve yerel değişkenleri vardır.
local co = coroutine.create(function()
print("start")
coroutine.yield()
print("resumed")
coroutine.yield()
print("done")
end)
print(coroutine.status(co)) -- suspended
coroutine.resume(co) -- start
print(coroutine.status(co)) -- suspended
coroutine.resume(co) -- resumedcoroutine.create ve coroutine.wrap
coroutine.create(fn) bir coroutine oluşturur ve bir coroutine nesnesi (thread türünde) döndürür. coroutine.wrap(fn) bir coroutine oluşturur ve çağrıldığında onu sürdüren bir işlev döndürür. wrap daha basittir ancak coroutine nesnesini gizler.
-- create: returns coroutine object
local co = coroutine.create(function(x)
return x * 2
end)
local ok, val = coroutine.resume(co, 5)
print(ok, val) -- true 10
-- wrap: returns a resumable function
local gen = coroutine.wrap(function(x)
return x * 3
end)
print(gen(5)) -- 15Coroutine Yaşam Döngüsü
Bir coroutine'in dört durumu vardır: askıya alınmış (çalışmıyor), çalışıyor (şu anda yürütülüyor), ölü (döndürülmüş veya hata oluşmuş) ve normal (başka bir coroutine'i sürdürdüğü için duraklatılmış). Durumu coroutine.status(co) ile denetleyin.
local co = coroutine.create(function()
coroutine.yield()
end)
print(coroutine.status(co)) -- suspended
coroutine.resume(co) -- runs until yield
print(coroutine.status(co)) -- suspended again
coroutine.resume(co) -- runs until end
print(coroutine.status(co)) -- deadBirden Çok Coroutine Çalıştırma
Birden çok coroutine oluşturun ve her birini sırayla sürdürerek bunları dönüşümlü çalıştırın. Bu, eşzamanlı yürütmeyi (işbirlikçi çoklu görevi) benzetir. Her coroutine, yield çağrıları arasındaki kendi durumunu korur.
local function worker(name, steps)
for i = 1, steps do
print(name .. ": step " .. i)
coroutine.yield()
end
end
local co1 = coroutine.create(function() worker("A", 3) end)
local co2 = coroutine.create(function() worker("B", 3) end)
for _ = 1, 3 do
coroutine.resume(co1)
coroutine.resume(co2)
end
-- A:1, B:1, A:2, B:2, A:3, B:3coroutine.wrap ile Yineleme
coroutine.wrap genellikle yineleyiciler oluşturmak için kullanılır. Döndürülen işlev, yineleyici her ilerlediğinde çağrılır. Coroutine gövdesi sona erdiğinde işlev bir hata verir; gerekirse pcall kullanın veya durumu denetleyin.
local function range(n)
return coroutine.wrap(function()
for i = 1, n do
coroutine.yield(i)
end
end)
end
for v in range(5) do
io.write(v .. " ")
end
print() -- 1 2 3 4 5Coroutine'lerde Hata
Bir coroutine hata verirse coroutine.resume, ardından hata iletisi gelecek şekilde false döndürür. Coroutine, dead durumuna geçer. Ölü bir coroutine yeniden sürdürülemez.
local co = coroutine.create(function(x)
if x < 0 then error("negative input: " .. x) end
return math.sqrt(x)
end)
local ok, val = coroutine.resume(co, -1)
print(ok, val) -- false input:2: negative input: -1
print(coroutine.status(co)) -- dead
-- Can't resume a dead coroutine:
ok, val = coroutine.resume(co)
print(ok, val) -- false cannot resume dead coroutineCoroutine Kimliği
coroutine.running(), o anda çalışan coroutine'i ve bunun ana iş parçacığı olup olmadığını belirten bir Boole değeri döndürür. Bir coroutine'in içindeyken kendisine başvuru almak için bunu kullanın.
local co = coroutine.create(function()
local self, isMain = coroutine.running()
print("type:", type(self)) -- thread
print("isMain:", isMain) -- false
print("status:", coroutine.status(self)) -- running
end)
coroutine.resume(co)
-- In main thread:
local main, isMain = coroutine.running()
print("main isMain:", isMain) -- trueSonsuz Üretici
Bir coroutine gövdesi, içinde yield çağrıları bulunan sonsuz bir döngü içerebilir; üretici, sonlanmadan isteğe bağlı olarak değerler üretir. Bu, tembel ve sonsuz diziler için temel bir kullanım alanıdır.
local function naturals(start)
return coroutine.wrap(function()
local n = start or 1
while true do
coroutine.yield(n)
n = n + 1
end
end)
end
local gen = naturals(1)
for i = 1, 8 do
io.write(gen() .. " ")
end
print() -- 1 2 3 4 5 6 7 8Görevler Olarak Coroutine'ler
Temel bir görev zamanlayıcısı, coroutine'leri bir kuyrukta saklar ve her birini sırayla sürdürür. Bir coroutine yield çağrısı yaptığında kuyruğa geri eklenir. Sonlandığında kuyruktan çıkarılır. Bu, en yalın işbirlikçi zamanlayıcıdır.
local tasks = {}
local function spawn(fn)
tasks[#tasks+1] = coroutine.create(fn)
end
local function run()
while #tasks > 0 do
local alive = {}
for _, co in ipairs(tasks) do
coroutine.resume(co)
if coroutine.status(co) ~= "dead" then
alive[#alive+1] = co
end
end
tasks = alive
end
end
spawn(function() for i=1,3 do print("T1:"..i); coroutine.yield() end end)
spawn(function() for i=1,3 do print("T2:"..i); coroutine.yield() end end)
run()Coroutine Belleği
Her coroutine kendi yığınına sahiptir. Derin çağrı zincirlerinde yığınlar büyüyebilir. Yüksek performans gerektiren senaryolarda aynı anda binlerce etkin coroutine oluşturmaktan kaçının. Mümkün olduğunda coroutine'leri yeniden kullanın veya havuzlar kullanın.
-- Coroutine pool concept
local pool = {}
local function getCoroutine(fn)
-- Reuse dead coroutine slots
for i, co in ipairs(pool) do
if coroutine.status(co) == "dead" then
pool[i] = coroutine.create(fn)
return pool[i]
end
end
local co = coroutine.create(fn)
pool[#pool+1] = co
return co
end
print("Pool pattern for coroutine reuse")Hızlı Kontrol
coroutine.create(fn) çağrısından hemen sonra bir coroutine hangi durumdadır?
Özet: Coroutine Oluşturma
Özet:
coroutine.create(fn)→ coroutine nesnesi;wrap(fn)→ yeniden başlatılabilir işlev- Durumlar: askıya alınmış → çalışıyor → askıya alınmış/ölü
coroutine.resume(co, ...)başlatır/devam ettirir- Devam ettirme sırasında hatalar: false + hata iletisi; coroutine → ölü
while true do yield() endile sonsuz üreticiler- İşbirlikli çoklu görev ve tembel diziler için kullanın
Sıkça Sorulan Sorular
“Coroutine Oluşturma” dersi ücretsiz mi?
Evet — “Coroutine Oluşturma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.
“Coroutine Oluşturma” dersinde ne öğreneceğim?
coroutine.create ve coroutine.wrap ile coroutine'ler oluşturun. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Lua Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Coroutine Oluşturma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Coroutine Oluşturma
- resume ve yield
- Coroutine Durumu
- Üretici-Tüketici Örüntüsü