gpt4 book ai didi

python - 使用 asyncio 在后台运行线程类中的函数

转载 作者:行者123 更新时间:2023-11-30 22:24:35 25 4
gpt4 key购买 nike

这是我第一次尝试在项目中使用asyncio。我希望我的类能够初始化并运行,其中的几个函数定期“在后台”运行。我希望类的 init 在启动这些后台任务后返回,以便它可以同时继续执行同步操作。

我有:

 class MyClass(threading.Thread):
def __init__(self, param):
self.stoprequest = threading.Event()
threading.Thread.__init__(self)

self.param = param

self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.loop)
asyncio.ensure_future(self.periodic(), loop=self.loop)

print("Initialized")

async def periodic(self):
while True:
print("I'm here")
await asyncio.sleep(1)

def run(self):
# continue to do synchronous things

毫无疑问,这行不通。我还尝试在 init 中使用带有 run_until_complete() 的“正常”asyncio 函数,但当然 init 永远不会返回。

如何在后台定期运行属于此类的 asyncio 函数,而该类的其余部分 (run()) 继续执行同步工作?

最佳答案

将循环作为参数传递给 ensure_future 不会启动此循环。您应该调用 run_until_completerun_forever 来强制启动协程,没有其他方法可以做到这一点。

How can I run asyncio functions that belong to this class periodically in the background, while the rest of the class (run()) continues to do synchronous work?

你不能。正如您无法在主线程中同时运行事件循环和同步代码一样。 Loop starting - 阻塞线程的执行流,直到循环停止。这就是asyncio 的工作原理。

如果您想在后台运行asyncio,您应该在单独的线程中运行它并在主线程中执行同步操作。有关如何执行此操作的示例,请参阅 here .

如果您需要在线程中与 asyncio 一起运行阻塞代码,现在最方便的方法是在主线程中运行 asyncio 并在后台线程中运行阻塞代码使用run_in_executor函数。您可以找到这样做的示例 here .

需要指出的是,asyncio 本身通常在主线程(没有其他线程)中使用,以实现异步编程的好处。您确定需要第二个线程吗?如果没有请阅读this answer了解为什么使用 asyncio

关于python - 使用 asyncio 在后台运行线程类中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47780911/

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