Python - 同时运行多个异步函数

neiii

我本质上是在制作一个 pinger,它有一个 2d 列表,密钥/webhook 对,在 ping 一个密钥后,将响应发送到 webhook

二维列表如下:

some_list = [["key1", "webhook1"], ["key2", "webhook2"]]

我的程序本质上是一个循环,我不太确定如何some_list在函数中旋转数据。

这是我的脚本的一个小演示:

async def do_ping(some_pair):
    async with aiohttps.ClientSession() as s:
        tasks = await gen_tasks(s, some_pair)
        results = await asyncio.gather(*tasks*)
        sleep(10)
        await do_ping(some_pair)

我试过了:

async def main(): 
    for entry in some_list: 
        asyncio.run(do_ping(entry))

但是由于该do_ping函数是一个自调用循环,它只是一遍又一遍地调用第一个,而永远不会到达它之后的那些。希望找到一个解决方案,无论是线程还是类似的,如果你有更好的结构化some_list值的方法(我认为这将是一个字典),也可以随意放弃该反馈

薄片

你让你的方法 recursive await do_ping(some_pair),它永远不会结束循环main继续。我会像这样重组应用程序:

async def do_ping(some_pair):
    async with aiohttps.ClientSession() as s:
        while True:
            tasks = await gen_tasks(s, some_pair)
            results = await asyncio.gather(*tasks)
            await asyncio.sleep(10)


async def main(): 
    tasks = [do_ping(entry) for entry in some_list]
    await asyncio.gather(*tasks)


if __name__ == "__main__":
    asyncio.run(main())

或者,您可以将重复和睡眠逻辑移动到main

async def do_ping(some_pair):
    async with aiohttps.ClientSession() as s:
        tasks = await gen_tasks(s, some_pair)
        results = await asyncio.gather(*tasks)


async def main(): 
    while True:
        tasks = [do_ping(entry) for entry in some_list]
        await asyncio.gather(*tasks)
        await asyncio.sleep(10)


if __name__ == "__main__":
    asyncio.run(main())

您也可以在调用 sleep 之前启动任务,然后收集它们。这将使 ping 更一致地以 10 秒的间隔开始,而不是 10 秒 + 收集结果所需的时间:

async def main(): 
    while True:
        tasks = [
            asyncio.create_task(do_ping(entry))
            for entry in some_list
        ]
        await asyncio.sleep(10)
        await asyncio.wait(tasks)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章