如何组合动态数量 (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)
它接受以下参数:
- 客户端:币安异步客户端(python-binance 库)
- 队列:如果计算结果为正,机会就会进入队列
- 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))
目前正在做一个项目,使用 Binance Websockets 获取硬币价格数据并用数据进行计算。
我计算的硬币数量是动态的(从 150 到 ~250 不等)。
调用了ASYNC函数calculate(client, queue, coin)
它接受以下参数:
- 客户端:币安异步客户端(python-binance 库)
- 队列:如果计算结果为正,机会就会进入队列
- 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))