【问题标题】:Gathering coin volumes - Is my code running asynchronously?收集硬币量 - 我的代码是否异步运行?
【发布时间】:2018-04-24 12:14:28
【问题描述】:

我是python编程的新手,我已经编程了大约半年。我决定尝试构建一个功能性交易机器人。在尝试编写这个机器人时,我偶然发现了 asyncio 模块。我真的很想更好地理解这个模块,但是很难找到任何关于 asyncio 的简单教程或文档。

对于我的脚本,我收集每个硬币的数量。这非常有效,但收集所有卷需要很长时间。我想问一下我的脚本是否同步运行,如果是,我该如何解决?我正在使用 API 包装器与 Binance Exchange 进行通信。

import binance
import asyncio
import time

s = time.time()
names = [name for name in binance.ticker_prices()] #Gathering all the coin names
loop = asyncio.get_event_loop()

async def get_volume(name):
    async def get_data():
        return binance.ticker_24hr(name) #Returns per coin a dict of the data of the last 24hr

    data = await get_data()

    return (name, data['volume'])

tasks = [asyncio.ensure_future(get_volume(name)) for name in names]

results = loop.run_until_complete(asyncio.gather(*tasks))

print('Total time:', time.time() - s)

【问题讨论】:

    标签: python-asyncio


    【解决方案1】:

    由于binance.ticker_24hr 看起来不像是协程,它几乎肯定会阻塞事件循环,因此阻止asyncio.gather 完成它的工作。作为快速修复,您可以使用run_in_executor 在单独的线程中运行阻塞函数:

    async def get_volume(name):
        loop = asyncio.get_event_loop()
        data = await loop.run_in_executor(None, binance.ticker_24hr, name)
        return name, data['volume']
    

    这对于合理数量的并行任务来说效果很好。缺点是它使用线程,因此它可能无法扩展到大量并行请求(或者需要不必要的等待)。从长远来看,正确的解决方案是使用原生支持 asyncio 的库。

    【讨论】:

      【解决方案2】:

      Maarten 首先,您为每个符号调用 get_ticker,这意味着您提出了许多不必要的请求。如果您在没有符号值的情况下调用它,您将在一个请求中获得所有代码。如果您不执行其他任务,这也会删除任何循环或异步。您使用的 binance 库似乎不支持此功能。你可以使用python-binance来做

      return client.get_ticker()
      

      也就是说,我一直在测试 python-binance 的异步版本。如果您想尝试它,它现在在一个功能分支中。

      pip install git+https://github.com/sammchardy/python-binance@feature/asyncio
      

      包含客户端的asyncio版本并初始化客户端

      from binance.client_async import AsyncClient as Client
      client = Client("<api_key>", "<api_secret>")
      

      然后您可以等待调用以获取特定交易品种的代码

      return await client.get_ticker(symbol=name)
      

      或者对于所有符号代码不传递符号参数

      return await client.get_ticker()
      

      希望有帮助

      【讨论】:

        猜你喜欢
        • 2018-11-16
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        • 2020-06-17
        • 1970-01-01
        • 2021-12-28
        • 2022-01-08
        • 2015-08-10
        相关资源
        最近更新 更多