2017-11-21 133 views
6

Mam aplikację internetową zbudowaną na strukturze asynchronicznej Python 3.5+ (apistar, sanic, itp.). Aplikacja wykonuje różne wywołania IO - do bazy danych, Redis, itd. - które również są asynchroniczne.Kiedy używać wielu pętli zdarzeń?

Some docs zalecamy stosowanie dodatkowej pętli zdarzenia:

import asyncio 
import peewee 
from peewee_async import Manager, PostgresqlDatabase 

loop = asyncio.new_event_loop() # Note: custom loop! 
database = PostgresqlDatabase('test') 
objects = Manager(database, loop=loop) 

To moja zrozumienie, że await oświadczenia pozwalają pętlę zdarzeń do przełączania kontekstu, kiedy to uderza IO, więc dodatkowe pętle zdarzeń wydaje się zupełnie zbędne.

Jakie korzyści wynikają z zastosowania dodatkowej pętli zdarzeń i kiedy należy użyć dodatkowych pętli?

Odpowiedz

0

Powinieneś używać tylko jednej pętli we-wy na raz i tylko jedna pętla we-wy jest dozwolona dla jednego wątku jednocześnie. threading i asyncio używają różnych i kontrastujących podejść do współbieżności. Uruchomienie więcej niż jednej pętli (w więcej niż jednym wątku) jest uważane za złą praktykę i powinno się jej unikać.

Powyższe dokumenty nie sugerują użycia "dodatkowej" pętli. Pokazuje, jak jawnie określić niestandardową pętlę bez (lub wcześniej) rejestrowania jej jako pętli domyślnej.

0

Powinieneś używać wielu pętli zdarzeń jeden po drugim po uruchomieniu testów, aby każdy przypadek testowy był uruchamiany względem własnej pętli zdarzeń.

Może być konieczne użycie wielu pętli jednocześnie w zależności od wymagań podstawowych ram. W przykładach pyzmq i quamash wymagają własnej pętli zdarzeń.

Możesz chcieć użyć wielu pętli jednocześnie, jeśli potrzebujesz lepszej kontroli nad wykonywaniem zadania. Na przykład, gdy chcesz jawnie grupować zadania i decydować, która grupa ma zostać wykonana.

Należy pamiętać, że obecna implementacja pozwala na uruchomienie tylko jednej pętli na wątek na raz.