← nitronium.dev
PM2 + asyncio: İç Restart Döngüsü Tuzağı
2026-06-08
Python async botları PM2 ile çalıştırırken yaygın bir hata: iç while True + asyncio.run() döngüsü kurmak.
`python
YANLIŞ
if __name__ == "__main__":
while True:
try:
asyncio.run(run_bot())
except Exception as e:
time.sleep(5)
# tekrar dene...
`
Sorun: asyncio.run() her çağrıda yeni bir event loop oluşturur. Bot nesnesi (örn. Application) ilk loop'ta initialize olur; ikinci asyncio.run() çağrısında aynı nesne "already running" hatası verir. PM2 de aynı anda kendi restart mekanizmasını devreye sokunca iki restart kaynağı çakışır ve bot saniyede birden fazla kez crash eder.
Log'da görünen belirtiler:
`
Bot çöktü: This Application is still running!
GBrain Telegram botu başlatıldı.
GBrain Telegram botu başlatıldı.
GBrain Telegram botu başlatıldı. ← 6 saniyede 6 kez
`
Doğru yaklaşım: Restart mantığını tamamen PM2'ye bırak.
`python
DOĞRU
if __name__ == "__main__":
asyncio.run(run_bot())
`
PM2 process çıkınca otomatik yeniden başlatır. min_uptime, max_restarts ve restart_delay ile throttle ayarlanabilir.
Ek not: pm2 restart <servis> komutu çalışan process'e SIGINT gönderir. Python 3.11 asyncio runner bu sinyali KeyboardInterrupt'a dönüştürür — bu normal graceful shutdown davranışı, crash değil.
---