【发布时间】:2018-04-03 05:35:15
【问题描述】:
我有一个类,其方法如下所示:
# self.stop_event -> threading.Event
def run(self):
while not self.stop_event.wait(3): # i.e. repeat every 3 sec
pass # do stuff
想法是其中几个在它们自己的线程中运行,并且在某些时候一个线程执行stop_event.set(),这自然会停止所有其他线程。我想为此切换到 asyncio,因为run 中的任务主要是在睡觉和做 IO。因此,我必须:
# self.stop_event -> asyncio.Event
async def run(self):
while not self.stop_event.is_set():
await asyncio.sleep(3)
pass # do stuff
问题是asyncio.Event是不能等待的,所以设置的时候,在方法完成之前最多有3秒的等待时间。这是一个问题,因为睡眠时间可能是几分钟。目前,我正在通过将run 包装在asyncio.Task 中,然后像event_loop.call_soon(the_task.cancel) 一样取消它来解决这个问题。
我想问是否有更好的方法来实现上述?有没有办法让asyncio.Event 以某种方式超时,类似于threading.Event?
【问题讨论】:
-
IIRC,你可以很容易地为
asyncio构建类似 Curio 的timeout_after函数,但它最终会变得有点重(因为你必须将它包裹在Future然后 @ 987654334@ 超时)。无论如何,有了它,你可以做await timeout_after(3, self.stop_event.wait),它得到你想要的。如果您有兴趣并且无法从该提示中弄清楚,我可以尝试挖掘我的实现,但可能要到明天...... -
我找到了来源,会检查一下,谢谢。
标签: python events python-asyncio