gpt4 book ai didi

python - 在具有 asyncio.coroutine 方法的类外部声明的 asyncio event_loop 失败并显示 "AttributeError: ' NoneType' 对象没有属性 'select'“

转载 作者:太空狗 更新时间:2023-10-30 02:31:14 34 4
gpt4 key购买 nike

探索 Python 3.4.0 的 asyncio 模块,我试图创建一个类,其中包含从类外部的 event_loop 调用的 asyncio.coroutine 方法。

我的工作代码如下。

import asyncio

class Foo():
@asyncio.coroutine
def async_sleep(self):
print('about to async sleep')
yield from asyncio.sleep(1)

@asyncio.coroutine
def call_as(self):
print('about to call ass')
yield from self.async_sleep()

def run_loop(self):
loop = asyncio.get_event_loop()
loop.run_until_complete(self.call_as())
print('done with loop')
loop.close()

a = Foo()
a.run_loop()

loop = asyncio.get_event_loop()
loop.run_until_complete(a.call_as())

a.run_loop() 的调用提供了预期的输出:

python3 async_class.py
about to call ass
about to async sleep
done with loop

但是,一旦 event_loop 尝试处理 a.call_as(),我就会得到以下回溯:

Traceback (most recent call last):
File "async_class.py", line 26, in <module>
doop.run_until_complete(asyncio.async(a.call_ass()))
File "/opt/boxen/homebrew/opt/pyenv/versions/3.4.0/lib/python3.4/asyncio/base_events.py", line 203, in run_until_complete
self.run_forever()
File "/opt/boxen/homebrew/opt/pyenv/versions/3.4.0/lib/python3.4/asyncio/base_events.py", line 184, in run_forever
self._run_once()
File "/opt/boxen/homebrew/opt/pyenv/versions/3.4.0/lib/python3.4/asyncio/base_events.py", line 778, in _run_once
event_list = self._selector.select(timeout)
AttributeError: 'NoneType' object has no attribute 'select'

我试图将 a.call_as() 包装在 asyncio.Task() 中,asyncio.async() 失败了一样。

最佳答案

事实证明,问题出在事件循环的上下文上。

asyncio 在运行时神奇地为线程创建事件循环。此事件循环的上下文在调用 .get_event_loop() 时设置。

在上面的示例中,a.run_loop 将事件循环设置在 Foo.run_loop 的上下文中。

事件循环的一个特点是每个线程可能只有一个事件循环,并且给定的事件循环只能在其上下文中处理事件。

考虑到这一点,请注意紧接在 a.run_loop 之后的 loop = asyncio.get_event_loop() 要求将线程的事件循环分配给 __main__ 上下文。不幸的是,事件循环已经设置为 Foo.run_loop 的上下文,因此为 __main__ 事件循环设置了 None 类型。

相反,有必要创建一个新的事件循环,然后将该事件循环的上下文设置为 __main__,即

new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)

只有这样,事件循环才会在 __main__ 的上下文中正确设置,允许正确执行我们现在修改的 new_loop.run_until_complete(a.call_as())

关于python - 在具有 asyncio.coroutine 方法的类外部声明的 asyncio event_loop 失败并显示 "AttributeError: ' NoneType' 对象没有属性 'select'“,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23298536/

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