8.13. Döngü kontrolü

Çoğu asyncio betiği olay döngüsüne hiç doğrudan dokunmaz – asyncio.run() yeterlidir. Bu sayfa, yeterli olmadığı durumlar için Loop yüzeyini kapsar: bir istisna işleyicisi kurmak, döngüyü run‘dan farklı bir yaşam döngüsüyle çalıştırmak veya araçlandırma amacıyla döngü nesnesini elde tutmak.

8.13.1. Döngüyü elde etme

  • asyncio.get_event_loop()Loop nesnesini döndürür. Bir eşyordamın içinden veya dışından çağrılması güvenlidir.

  • asyncio.new_event_loop() – MicroPython’da, yeni bir döngü oluşturmak yerine mevcut döngünün durumunu sıfırlar. Bu not tekrar edilmeyi hak ediyor: her programda tam olarak bir olay döngüsü vardır.

Loop üzerindeki metotlar ve asyncio.run() dışında döngüyü çalıştırmak için bir API yoktur.

8.13.2. Döngüyü doğrudan çalıştırma

asyncio.run() neredeyse her uygulama için doğru giriş noktasıdır. Yeterli olmadığı durumlar için iki Loop metodu vardır.

  • run_until_complete() – bir await edilebilir verildiğinde, o await edilebilir bitene kadar döngüyü çalıştırır, ardından sonucunu döndürür. Döngü söküm işlemi dışarıda bırakılmış tek bir asyncio.run() çağrısına eşdeğerdir.

  • run_forever() – döngüyü, bir görevin içinden stop() çağrılana kadar çalıştırır. Üst düzey bir await edilebilir yoktur; uygulamanın run_forever çağrılmadan önce ihtiyaç duyduğu her şeyi asyncio.create_task() aracılığıyla zamanlaması beklenir.

Eşlik eden metotlar stop() (mevcut görev bittikten sonra döngünün durmasını ister) ve close() (döngünün kaynaklarını serbest bırakır) metotlarıdır.

8.13.3. Döngü tarafında görev oluşturma

  • create_task()asyncio.create_task() ile aynı işlem. Bağımsız fonksiyon, uygulama kodunun yaygın durum için bir döngü referansına ihtiyaç duymaması için vardır; metot ise zaten bir referansı olan araçlandırma için vardır.

8.13.4. İstisna işleyicileri

Döngü, bir görev eşyordam çağrı zincirinde hiçbir yerin yakalamadığı bir istisna yükselttiğinde bir işleyiciyi çağırır – tipik bir durum, uygulamanın asyncio.create_task() ile oluşturduğu ve hiç await etmediği bir görevdir. Varsayılan işleyici sys.stderr üzerinden bir izleme yazdırır; istisnalar sayfası onu özel bir şeyle nasıl değiştireceğinizi göstermişti.

  • set_exception_handler() – özel bir işleyici kurar. İşleyici, context‘in en azından 'message' ve genellikle 'exception' ile 'future' içeren bir sözlük olduğu çağrılabilir bir handler(loop, context) öğesidir.

  • get_exception_handler() – o anda kurulu olan işleyiciyi döndürür veya varsayılan kullanılıyorsa None döndürür.

  • default_exception_handler() – yerleşik işleyici. Varsayılan davranışı da çalıştırmak isteyen özel bir işleyicinin içinde kullanışlıdır (örneğin, flash belleğe günlük tutmak ve bir izleme yazdırmak).

  • call_exception_handler() – o anda kurulu olan işleyiciyi elle oluşturulmuş bir context sözlüğüyle çalıştırır. Çoğunlukla döngünün kendisi tarafından kullanılır; bir uygulamanın buna nadiren ihtiyacı olur.