Python3 asyncio В потоке нет текущего события l oop, когда создается новый поток - PullRequest
0 голосов
/ 29 февраля 2020

Я легко могу воспроизвести эту проблему в следующем примере:

from threading import Thread
import asyncio

def func():
    asyncio.get_event_loop()

Thread(target=func).start()

Согласно документу:

Если в текущем потоке ОС не установлено текущее событие l oop, Поток ОС является основным, и set_event_l oop () еще не был вызван, asyncio создаст новое событие l oop и установит его как текущее.

1 Ответ

2 голосов
/ 29 февраля 2020

Автоматизация c назначение нового события l oop происходит только в главном потоке. Из источника asyncio DefaultEventLoopPolicy в events.py

def get_event_loop(self):
    """Get the event loop for the current context.

    Returns an instance of EventLoop or raises an exception.
    """
    if (self._local._loop is None and
            not self._local._set_called and
            isinstance(threading.current_thread(), threading._MainThread)):
        self.set_event_loop(self.new_event_loop())

    if self._local._loop is None:
        raise RuntimeError('There is no current event loop in thread %r.'
                            % threading.current_thread().name)

    return self._local._loop

Так что для неосновного потока необходимо вручную установить событие l oop с помощью asyncio.set_event_loop(asyncio.new_event_loop())

...