我本质上是在制作一个 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] 删除。
我来说两句