我正在编写一个程序,在某些时候需要收集未知数量的corroutines,程序管理多个帐户,并且每个帐户都有一个客户端程序,如何收集客户端的未知数量的帐户?
这是我目前的聚会功能。
loop.run_until_complete(asyncio.gather(
main_client.start(token),
account1.client.start(account.credentials),
#More accounts should go here
main_player_control.loop()
#If possible, also would like to have multiple player controls
))
答案 0 :(得分:3)
作为@Vincent said,您可以使用asyncio.gather
函数调用语法将可变数量的协程传递给*
。或者,您可以拨打asyncio.wait
,接受列表。
查看代码,单个gather
是否正确并不明显。 gather
一次启动所有协同程序,即与主循环并行运行授权协同程序。可能需要首先进行某种初始化/授权,然后是控制循环。在这种情况下,main
协程可以更好地为您提供服务:
async def main(main_client, token, accounts, main_player):
# authorize the main client
await main_client.start(token),
# authorize all the accounts in parallel
await asyncio.wait(account.client.start(account.credentials)
for account in accounts)
# once the above is complete, start the main loop
await main_player_control.loop()
loop.run_until_complete(main(main_client, token, accounts, main_player))