une*_*ven 2 python-3.x python-asyncio
是否可以使用 asyncio 为每个函数以不同的间隔定期运行 2 个不同的函数f?
如果是 - 您能否提供代码示例。
import asyncio
async def f1(host,*arg):
# call every 1 sec
pass
async def f2(url,*args):
# call every 2 sec
pass
Run Code Online (Sandbox Code Playgroud)
预期输出:
00:00 f1 for 1.1.1.1
00:01 f1 for 1.1.1.1
00:02 f2 for 'google.com'
00:02 f1 for 1.1.1.1
00:03 f1 for 1.1.1.1
00:04 f2 for 'google.com'
Run Code Online (Sandbox Code Playgroud)
是否可以使用 asyncio 为每个 f 以不同的间隔定期运行 2 个不同的函数?
当然,只需创建一个以“显而易见”的方式完成它的协程,通过在无限循环中等待协程并asyncio.sleep()在调用之间进行:
import asyncio, time
async def invoke_forever(period, corofn, *args):
while True:
then = time.time()
await corofn(*args)
elapsed = time.time() - then
await asyncio.sleep(period - elapsed)
Run Code Online (Sandbox Code Playgroud)
问题中描述的场景将设置为:
loop = asyncio.get_event_loop()
loop.create_task(invoke_forever(1, f1, 'host1'))
loop.create_task(invoke_forever(2, f2, 'host2'))
loop.run_forever()
Run Code Online (Sandbox Code Playgroud)
您还可以使用asyncio.gather将两者invoke_forever合并为一个 awaitable,这允许使用asyncio.runPython 3.7 中引入的函数:
async def invoke_both():
await asyncio.gather(invoke_forever(1, f1, 'host1'),
invoke_forever(2, f2, 'host2'))
asyncio.run(invoke_both())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1330 次 |
| 最近记录: |