Почему метод asyncio.get_event_loop проверяет, является ли текущий поток основным? - PullRequest
0 голосов
/ 12 апреля 2019

Почему метод get_event_loop в asyncio ( source ) проверяет, является ли текущий поток основным (см. Мой комментарий во фрагменте ниже)?

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

    This may be None or an instance of EventLoop.
    """
    if (self._local._loop is None and
        not self._local._set_called and
        isinstance(threading.current_thread(), threading._MainThread)):  # <- I mean this thing here
        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 

1 Ответ

2 голосов
/ 13 апреля 2019

Для удобства asyncio поддерживает автоматическое создание цикла событий без необходимости проходить вызовы к new_event_loop() и set_event_loop().Поскольку цикл обработки событий является относительно дорогостоящим и потребляет некоторые ресурсы ОС, он создается не при импорте, а по запросу, в частности при первом вызове get_event_loop().(Эта функция в основном устарела asyncio.run, которая всегда создает новый цикл событий, а затем автоматически созданный цикл может вызвать проблем .)

Это удобствооднако зарезервирован для основного потока - любой другой поток должен явно установить цикл обработки событий.Для этого есть несколько возможных причин:

  • предотвращение путаницы - вы не хотите, чтобы случайный вызов get_event_loop() из произвольного потока соответствовал «основному» (автоматически созданному) циклу событий дляэтот поток;
  • некоторые функции asyncio работают лучше всего, когда или требуют запуска цикла событий в главном потоке - например, подпроцессы и обработка сигналов .

Этих проблем также можно избежать, автоматически создавая новый цикл событий в каждом потоке, который вызывает get_event_loop(), но это упростит случайное создание нескольких циклов событий, сопрограммы которых будутбыть не в состоянии общаться друг с другом, что противоречило бы дизайну asyncio.Таким образом, оставшаяся опция - это специальный код для основного потока, побуждающий разработчиков использовать этот поток для выполнения асинхронного кода.

...