Moja główna wątek Pythona nie używa asyncio, ale tworzy nowy wątek, którego kod używa asyncio, gdzie napotkał błąd podczas wywołania {x2}}:

Traceback (most recent call last):
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/hanxu/work/thunderrock/node_server/quic/udp_async.py", line 33, in udp_async
    loop = asyncio.get_event_loop()
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/events.py", line 644, in get_event_loop
    % threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'Thread-5'.

Za dokument online Python 3.7, {{x0 }} powinien automatycznie utworzyć nową pętlę zdarzeń, jeśli nie ma już istniejącego. Dlaczego nie zawodzi w tym przypadku? Czy to z powodu gwintowania?

BTW Robię następujące czynności do obejścia, ale wciąż zastanawiasz się, dlaczego istniał problem:

    try:
        loop = asyncio.get_event_loop()
    except RuntimeError:
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
1
user1783732 17 styczeń 2020, 03:20

1 odpowiedź

Najlepsza odpowiedź

Dzięki za pytanie.

Dokumentacja jest nieco niepoprawna, nowa pauza jest domyślnie tworzona tylko dla głównego wątku.

Proszę śledzić https://bugs.Python.org/issue39381 dla poprawki.

0
Andrew Svetlov 18 styczeń 2020, 13:31