Okullar için Robotik ve Mühendislik · anaokulundan liseye

Bölüm 9 · Yazılımın içi · Ders 43

Olay döngüsü

Tek iş parçacığı, iki kuyruk: çıktı sırası neden şaşırtır?

Veri. Robotun denetleyicisi tek iş parçacıklı bir olay döngüsünde çalışıyor: 10 ms'de bir kontrol zamanlayıcısı, 5 ms'de gelen lidar verisi, bir de çözülen sözler (promise). Aynı anda yalnız bir iş yapabiliyor; yine de donmadan hepsine yetişmesi gerekiyor. Üç senaryoda çıktıların hangi sırayla ve hangi milisaniyede yazıldığını izliyoruz.

olay döngüsü başlarsenaryo 0: kim önce? · t = 0 ms
1 / 10
olay_dongusu.pypython
  1. import asyncio, time
  2. out, t0 = [], time.perf_counter()
  3. def log(s): # çıktı + zaman (ms)
  4. out.append(f"{s}@{(time.perf_counter()-t0)*1e3:.0f}ms")
  5. async def main():
  6. loop = asyncio.get_running_loop()
  7. log("başla") # eşzamanlı
  8. loop.call_later(0.010, log, "kontrol") # setTimeout 10 ms
  9. loop.call_later(0.005, log, "lidar") # G/Ç 5 ms sonra hazır
  10. f = loop.create_future()
  11. f.add_done_callback(lambda _: log("söz")) # then()
  12. f.set_result(None) # söz çözüldü
  13. t = time.perf_counter()
  14. while time.perf_counter() - t < 0.06: # 60 ms hesap
  15. pass # döngü kilitli
  16. log("hesap bitti")
  17. await asyncio.sleep(0.02) # döngüye bırak
  18. asyncio.run(main()) # olay döngüsü
  19. print(out)

Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.

Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.

Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide

Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.

olay_dongusu.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Eşzamanlı kod çağrı yığınında sonuna kadar çalışır; araya hiçbir şey giremez.
  2. Yığın boşalınca önce mikro görev kuyruğunun TAMAMI işlenir (promise.then; asyncio'da call_soon'un hazır kuyruğu). Mikro görevin eklediği mikro görev de hemen çalışır.
  3. Sonra makro kuyruktan yalnız BİR görev alınır (setTimeout, G/Ç tamamlanması), ardından yine bütün mikro görevler. Bu yüzden 0 ms zamanlayıcı bile sözden sonra gelir.
  4. Zamanlayıcının süresi bir söz değil, bir alt sınırdır: döngü 60 ms hesapla meşgulse 10 ms zamanlayıcı 50 ms gecikir.
  5. Şunu dene: senaryoyu 2 yap; kontrol zamanlayıcısının kırmızı gecikme çizgisine bak. Ağır hesabı ayrı bir iş parçacığına ya da parçalara bölmek bu yüzden gerekir.

Neden önemli

JavaScript (tarayıcı, Node.js), Python asyncio, ROS 2'nin tek iş parçacıklı yürütücüsü ve birçok gömülü denetleyici bu modelle çalışır. Robotikte kural basittir: döngüde uzun süren bir şey yapma; yoksa güvenlik zamanlayıcıları ve sensör geri çağırmaları gecikir, robot geç fren yapar.

ESOF 323, 11. hafta: robotlarda derin öğrenme →
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç