如何组合动态数量 (150-200) 的异步函数以用于计算目的

How to combine a dynamic amount (150-200) of async functions for calculation purposes

目前正在做一个项目,使用 Binance Websockets 获取硬币价格数据并用数据进行计算。

我计算的硬币数量是动态的(从 150 到 ~250 不等)。

调用了ASYNC函数calculate(client, queue, coin)

它接受以下参数:

  1. 客户端:币安异步客户端(python-binance 库)
  2. 队列:如果计算结果为正,机会就会进入队列
  3. coin:硬币,例如比特币

calculate 函数包含一个 while 1(不定式)循环,因此计算继续 运行。

目前 main 函数使用 asyncio.gather 组合不同硬币 (150 - ~250) 的计算函数

async def main(queue):

await asyncio.gather(
    calculate(client, queue, 'BTC'),
    calculate(client, queue, 'ETH'),
    calculate(client, queue, 'BNB'),
    calculate(client, queue, 'LINK'),
    calculate(client, queue, 'SHIB'),
    calculate(client, queue, 'ADA'),
    calculate(client, queue, 'XRP'),
    calculate(client, queue, 'VET')
    # This continues for the the other +100 coins
    )


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(queue))

这不是一个很好的代码编写方式,如果我想换硬币的话,效率很低。 使用 API 我获取需要计算的硬币。 所以我需要手动更新为每个硬币调用函数的 100 多行代码,并更新一些其他文件以确保一切顺利进行。

这个问题有什么好的解决方案?

我见过线程/多线程/更复杂的 asyncio 用法,但我看不出如何将它应用到这个问题上。

不胜感激。

您想创建一个代币列表来调用 calculate(),使用该列表创建一个计算列表,然后使用带星号的表达式将该列表解压缩为 asyncio.gather() 的参数:

async def main(queue):
    coins = ['BTC', 'ETH', 'BNB']  # Add more coins as desired.
    calculations = [calculate(client, queue, coin) for coin in coins]

    await asyncio.gather(*calculations)  # Use a starred expression to unpack the list.


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(queue))