gpt4 book ai didi

python - 为什么 asyncio.get_event_loop 方法检查当前线程是否为主线程?

转载 作者:行者123 更新时间:2023-11-30 21:55:53 25 4
gpt4 key购买 nike

为什么 asyncio ( source ) 中的 get_event_loop 方法会检查当前线程是否是主线程(请参阅下面代码片段中的我的评论)?

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

最佳答案

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

但是,这种便利是为主线程保留的 - 任何其他线程都必须显式设置事件循环。造成这种情况的可能原因有以下几种:

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

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

关于python - 为什么 asyncio.get_event_loop 方法检查当前线程是否为主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55656726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com