【问题标题】:Why asyncio.get_event_loop method checks if the current thread is the main thread?为什么 asyncio.get_event_loop 方法检查当前线程是否是主线程?
【发布时间】:2019-04-12 17:18:35
【问题描述】:

为什么 asyncio (source) 中的 get_event_loop 方法正在检查当前线程是否是主线程(请参阅下面 sn-p 中的评论)?

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 

【问题讨论】:

    标签: python multithreading python-asyncio


    【解决方案1】:

    为方便起见,asyncio 支持自动创建事件循环,而无需调用 new_event_loop()set_event_loop()。由于事件循环的创建成本适中,并且会消耗一些操作系统资源,因此它不会在导入时自动创建,而是按需创建,特别是在第一次调用 get_event_loop() 时。 (这个功能大部分被asyncio.run 淘汰了,它总是会创建一个新的事件循环,然后自动创建的会导致problems。)

    然而,这种便利是为主线程保留的——任何其他线程都必须显式设置事件循环。这有几个可能的原因:

    • 防止混淆 - 您不希望从任意线程意外调用 get_event_loop() 以占用该线程的“主”(自动创建)事件循环;
    • 当或要求在主线程中运行事件循环时,某些 asyncio 功能效果最佳 - 例如,subprocessessignal handling

    这些问题也可以通过在调用get_event_loop()每个线程中自动创建一个新的事件循环来避免,但这很容易意外创建多个协程无法执行的事件循环相互通信,这将违背 asyncio 的设计。所以剩下的选择是让代码对主线程进行特殊处理,鼓励开发人员使用该线程来执行 asyncio 代码。

    【讨论】:

      猜你喜欢
      • 2011-04-02
      • 2012-07-09
      • 1970-01-01
      • 2012-12-05
      • 2014-07-25
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      相关资源
      最近更新 更多