首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中使用asyncio每隔n秒运行一次函数

在python中使用asyncio每隔n秒运行一次函数
EN

Stack Overflow用户
提问于 2021-11-12 08:17:27
回答 2查看 193关注 0票数 1

我有一个应用程序,它已经无限运行,异步事件循环永远运行,而且我还需要每10秒运行一个特定的函数。

代码语言:javascript
运行
复制
def do_something():
   pass

a = asyncio.get_event_loop()
a.run_forever()

我想每10秒调用一次函数do_something。如何在不用while循环替换异步事件循环的情况下实现这一点?

编辑:我可以用下面的代码来实现这一点

代码语言:javascript
运行
复制
def do_something():
   pass
while True:
   time.sleep(10)
   do_something()

但是我不想使用while循环在我的应用程序中无限运行,相反,我想使用异步run_forever()。那么如何使用asyncio每10秒调用一次相同的函数呢?有没有像这样的调度器不会阻碍我正在进行的工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-12 08:48:14

asyncio没有提供内置的调度器,但是构建自己的调度器非常容易。只需将while循环与asyncio.sleep结合起来,就可以每隔几秒钟运行一次代码。

代码语言:javascript
运行
复制
async def every(__seconds: float, func, *args, **kwargs):
    while True:
        func(*args, **kwargs)
        await asyncio.sleep(__seconds)

a = asyncio.get_event_loop()
a.create_task(every(1, print, "Hello World"))
...
a.run_forever()

请注意,如果func本身是一个协程或长时间运行子例程,则设计必须稍有不同。在前一种情况下使用await func(...),在后一种情况下使用asyncio's thread capabilities

票数 3
EN

Stack Overflow用户

发布于 2021-11-12 08:21:45

您可以使用以下命令来实现它

代码语言:javascript
运行
复制
async def do_something():
   while True:
      await asyncio.wait(10)
      ...rest of code...


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(do_something())
    loop.run_forever()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69939800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档