0Pricing
Lua Academy · Ders

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)          -- resumed

coroutine.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))    -- 15

Coroutine 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))  -- dead

Birden Ç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:3

coroutine.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 5

Coroutine'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 coroutine

Coroutine 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)    -- true

Sonsuz Ü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 8

Gö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() end ile 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

  1. Coroutine Oluşturma
  2. resume ve yield
  3. Coroutine Durumu
  4. Üretici-Tüketici Örüntüsü
← Lua Academy Sayfasına Dön