2015-12-23 16 views
7

Czytałem o module asyncio w python 3, a szerzej o coroutines w python, i nie mogę uzyskać tego, co czyni asyncio tak wspaniałym narzędziem. Mam wrażenie, że wszystko, co można zrobić z Coroutines, można zrobić lepiej, używając kolejek zadań opartych na module wieloprocesowym (np. Seler). Czy są przypadki użycia, w których współrzędne są lepsze niż kolejki zadań?asyncio i coroutines kontra kolejki zadań

Odpowiedz

9

Nie właściwa odpowiedź, ale lista podpowiedzi, które nie mieściły się w komentarzu:

  • Jesteś wspomnieć moduł multiprocessing (i rozważmy threading zbyt). Załóżmy, że musisz obsłużyć setki gniazd: czy możesz odradzać setki procesów lub wątków?

  • Ponownie, z wątkami i procesami: jak radzić sobie z równoczesnym dostępem do współdzielonych zasobów? Jaki jest narzut mechanizmów takich jak blokowanie?

  • Szkielety takie jak Seler również zwiększają obciążenie. Czy możesz go użyć np. do obsługi każdego żądania na serwerze internetowym o dużym natężeniu ruchu? Nawiasem mówiąc, w tym scenariuszu, kto jest odpowiedzialny za obsługę gniazd i połączeń (Selery ze swojej natury nie może tego zrobić dla ciebie)?

  • Pamiętaj, aby przeczytać the rationale behind asyncio. To uzasadnienie (między innymi) wspomina o wywołaniu systemowym: writev() - nie jest o wiele bardziej wydajne niż wielokrotne write() s?

1

Dodając do powyższego odpowiedź:

Jeśli zadanie pod ręką jest I/O związany i działa na udostępnionych danych, współprogram i asyncio są prawdopodobnie droga.

Jeśli z drugiej strony masz zadania związane z procesorem, w których dane nie są współużytkowane, system wieloprocesowy, taki jak Celery, powinien być lepszy.

Jeśli zadanie jest dostępne zarówno dla procesora, jak i operacji wejścia/wyjścia, a udostępnianie danych nie jest wymagane, nadal korzystałbym z Celery. Możesz używać asynchronicznych operacji we/wy z poziomu aplikacji Celery!

Jeśli masz zadanie związane z CPU, ale z potrzebą współużytkowania danych, jedyną dostępną opcją, jaką widzę teraz, jest zapisanie udostępnionych danych w bazie danych. Były ostatnio próby takie jak pyparallel, ale wciąż są w toku.

Powiązane problemy