Asyncio如何收集可变数量的corroutines?

时间:2018-02-08 11:39:36

标签: python python-asyncio

我正在编写一个程序,在某些时候需要收集未知数量的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
))

1 个答案:

答案 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))