2016-10-31 24 views
12

Używam asyncio w mojej aplikacji i jestem nieco zdezorientowany, jeśli chodzi o przekazanie pętli zdarzeń jako argumentu.Przekazywanie pętli asyncio przez argument lub użycie domyślnej pętli asyncio

Masz trzy możliwości podczas pisania funkcji/metody przy użyciu pętli zdarzeń:

  • Przepuścić asyncio zdarzeń pętlę jako argument
  • Nie używaj argumentu dla przypadku pętla i użyj asyncio.get_event_loop()
  • Opcjonalnie, aby przekazać pętlę zdarzeń jako argument. Jeśli nie zostanie przekazany, należy użyć asyncio.get_event_loop()

Wygląda na to, że ostatni przypadek jest używany przez większość czasu, ale nawet w aplecie asyncio, użycie jest niespójne. Ponieważ nie zamierzam używać dwóch oddzielnych pętli zdarzeń , które przemawiają przeciwko używaniu tylko asyncio.get_event_loop() w razie potrzeby?

Jaki jest najlepszy sposób na wykonanie?

+0

Czy możesz wyjaśnić "przekazywanie pętli zdarzeń jako argumentu"? Przekazywanie pętli zdarzeń skąd dokąd? Jest to raczej specyficzne dla aplikacji niż ogólne pytanie (w zależności od tego, w jaki sposób aplikacja używa pętli zdarzeń, odpowiedź może być różna). – farzad

+0

'asyncio.get_event_loop()' zwraca pętlę zdarzeń, możesz ją zmienić za pomocą 'asyncio.set_event_loop()'. To 'get/set' pętli zdarzeń w' _event_loop_policy', zmiennej globalnej w module 'asyncio'. Jest to łatwy sposób na udostępnienie wydarzenia w aplikacji bez potrzeby przekazywania go. Więc jeśli chcesz uniknąć 2 oddzielnych pętli zdarzeń, możesz zarejestrować pętlę zdarzeń, którą masz w tej zmiennej globalnej, przez 'set_event_loop()'. – farzad

+0

@farzad: Zazwyczaj moja aplikacja zaczyna się od 'loop = asyncio.get_event_loop()'. Następnie konfiguruję asynchroniczne elementy (coroutines, async servers, ...) i moje własne funkcje, w których mam pytanie o przekazanie argumentu pętli. Kiedy wszystko jest skonfigurowane, uruchamiam 'loop.run_forever()'. –

Odpowiedz

5

Dobry (jak w chwalonym przez Guido van Rossuma) wpis na blogu omawiający to jest Some thoughts on asynchronous API design in a post-async/await world. Dalsza dyskusja z programistami Pythona here.

TLDR;

Jeśli używasz tylko jednej pętli zdarzeń, nie ma to znaczenia.

Jeśli zarządzanie wieloma pętle, i mają python> = 3,6 to przeważnie nie ma znaczenia: Nie używaj argumentu i użyć asyncio.get_event_loop() gdzie to konieczne, to daje poprawną pętli.

+1

Zajęło mi trochę czasu sprawdzenie, czy Guido był na pokładzie. Ta wiadomość była przydatna: https://groups.google.com/d/msg/python-tulip/yF9C-rFpiKk/tk5oA3GLHAAJ –