# Kavramlar - Coroutineler

- **İngilizce aslı:** https://wiki.facepunch.com/gmod/thread
- **Çeviri tarihi:** 2025-09-08

## Coroutineler ve Threadler

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

Ancak, [coroutine](https://gmod.tr/wiki/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](https://gmod.tr/wiki/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](https://gmod.tr/wiki/coroutine.create) kullanarak bir coroutine oluşturabilirsiniz. Bu, yeni coroutine'i temsil eden thread türünde bir değer döndürür:

```lua
co = coroutine.create( function()
  print( "hi" )
end )

print( co )   --> thread: 0x8071d98
```

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

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

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

```lua
coroutine.resume(co)   --> hi
```

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

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

### Akışı Devretme (Yielding)

Coroutine'ler, yürütmelerini duraklatan ve daha sonra devam ettirilmelerine olanak tanıyan [coroutine.yield](https://gmod.tr/wiki/coroutine.yield) ile kullanışlı hale gelir.

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

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

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

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

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

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

```lua
co = coroutine.create( function()
  return 6, 7
end)

print( coroutine.resume(co) )     --> true 6 7
```

## Ek Kaynaklar

[Lua Wiki Coroutines Tutorial](http://lua-users.org/wiki/CoroutinesTutorial)

[Online Lua Manual Coroutines Chapter](https://www.lua.org/pil/9.html)

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/thread
