Bir sunucu uygulaması oluşturmak için Python 3 asyncio
modülünü kullanmak istiyorum. Ağı dinlemek için bir ana olay döngüsü kullanıyorum ve yeni veriler alındığında, bazı hesaplamalar yapar ve sonucu istemciye gönderir. 'Bazı hesaplamalar' yeni bir olay döngüsüne mi ihtiyaç duyar? veya ana olay döngüsünü kullanabilir mi?Bir programda iki asyncio olay döngüsü kullanmalı mıyım?
9
A
cevap
9
Sen ana olay döngü içinde hesaplama işi yapabilir, ama bu olur ise bütün olay döngü engellenir - diğer istekler servis edilebilir ve olay döngü içinde çalışan var başka bir şey engellenecektir. Bu kabul edilebilir değilse, muhtemelen hesaplama işlemini BaseEventLoop.run_in_executor
kullanarak ayrı bir işlemde çalıştırmak isteyebilirsiniz.
import time
import asyncio
from concurrent.futures import ProcessPoolExecutor
def cpu_bound_worker(x, y):
print("in worker")
time.sleep(3)
return x +y
@asyncio.coroutine
def some_coroutine():
yield from asyncio.sleep(1)
print("done with coro")
@asyncio.coroutine
def main():
loop = asyncio.get_event_loop()
loop.set_default_executor(ProcessPoolExecutor())
asyncio.async(some_coroutine())
out = yield from loop.run_in_executor(None, cpu_bound_worker, 3, 4)
print("got {}".format(out))
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Çıktı:
in worker
done with coro
got 7
cpu_bound_worker
çocuk sürecinde çalıştırılmaktadır ve olay döngü böyle sonuç bekler başka herhangi engellenmeyen ben İşte gösteren çok basit bir örnek/O işlemi, bu nedenle diğer koroutinlerin çalışmasını engellemez.
İlgili konular
- 1. Aiohttp, Asyncio: RuntimeError: Olay döngüsü kapalı
- 2. Python işlem başına Asyncio olay döngüsü (aioprocessing, çoklu olay döngüleri)
- 3. Bir asyncio olay döngüsü, Python yorumlayıcısını askıya almadan arka planda çalışır mı? asyncio için
- 4. LINQ'de iki kez OrderByDescending kullanmalı mıyım?
- 5. Bu sınıfta kullanmalı mıyım?
- 6. Miras veya kompozisyon kullanmalı mıyım?
- 7. Ben Evrensel-ctags kullanmalı mıyım?
- 8. Pytron ile wtform kullanmalı mıyım?
- 9. Bu gibi constexpr kullanmalı mıyım?
- 10. Parametrelere bağlanırsam mysql_real_escape_string kullanmalı mıyım?
- 11. Raylar 3.1: CoffeeScript kullanmalı mıyım?
- 12. Performans: Bir değişkeni başlatmalı mıyım yoksa 'bunu kullanmalı mıyım?
- 13. Bir asyncio olay döngüsüne iş gönderme
- 14. Her bir POST isteğinde ValidateAntiForgeryToken kullanmalı mıyım?
- 15. Her tablo için bir CursorAdapter kullanmalı mıyım?
- 16. Bir Kullanıcı Denetimi için IDisposable kullanmalı mıyım?
- 17. Bir olay işleyicisini kaldırmalı mıyım?
- 18. Çalışma zamanı hatası: Olay döngüsü çalışıyor
- 19. Laravel'de belongsTo veya hasOne kullanmalı mıyım?
- 20. Scala'daki yapılandırma verileri - Reader monadını kullanmalı mıyım?
- 21. Bu durumda Kalıtım veya Kompozisyon kullanmalı mıyım?
- 22. Android: MimeTypeMap.getFileExtensionFromUrl() kullanmalı mıyım? [Hatalar] Örneğin
- 23. Cms kullanmalı mıyım yoksa sıfırdan başlamalıyım
- 24. Tip uyuşmazlığı, mutlaka liftIO kullanmalı mıyım?
- 25. @ İmleci veya manifest dosyalarını kullanmalı mıyım?
- 26. ApplyUpdates (0) veya ApplyUpdates (-1) kullanmalı mıyım?
- 27. ExtJS 6: Config nesnesini kullanmalı mıyım?
- 28. GZIP sıkıştırma katman yazılımı kullanmalı mıyım?
- 29. Mod yeniden yazımı kullanıyorsanız ProxyPassReverse kullanmalı mıyım?
- 30. Javascript için getHours() veya getUTCHours kullanmalı mıyım?
Üretici tüketici modeli gibi bir şey mi arıyorsunuz? http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem –
Bu durumda, üreticiyi ana döngüden işlem olarak kullanabilir ve sadece bir döngüye gereksinim duyarsınız. Bu ağ kullanımı bir bilgisayara bir çok ağ bağlantı noktasına sahip. –