【问题标题】:Asyncio Return future pending for resultAsyncio 返回未决的结果
【发布时间】:2018-09-25 02:57:43
【问题描述】:

我正在使用一个名为 IBSYNC 的包从 Interactive Broker 请求数据。基本上,代码将返回一个 XML 文件。

代码正在运行,我可以看到 XML 已返回(打印在代理的控制台上)。但是,当我使用 .result() 时,它会返回未决的未来。

我怎样才能获得 XML?

async def ReportsFinStatements(symbol, exchange, currency, primary):
    stock = Stock(symbol, exchange, currency, primaryExchange= primary)
    #ib.qualifyContractsAsync(stock)
    assert await ib.reqContractDetailsAsync(stock)
    data = ib.reqFundamentalDataAsync(contract=stock, reportType='ReportsFinStatements')
    return data

async def main():
    group1 = loop.create_task(ReportsFinStatements('PIH', 'SMART', 'USD', 'NASDAQ'))
    group2 = loop.create_task(ReportsFinStatements('PIH', 'SMART', 'USD', 'NASDAQ'))
    group3 = loop.create_task(ReportsFinStatements('PIH', 'SMART', 'USD', 'NASDAQ'))
    await asyncio.wait([group1, group2, group3])
    return group1, group2, group3

if __name__ == '__main__':
    try:
        loop = asyncio.get_event_loop()
        d1, d2, d3 = loop.run_until_complete(main())
    except Exception as e:
        print('logging')
    finally:
        loop.close()

d1 是<Task finished coro=<ReportsFinStatements() done, defined at <ipython-input-4-4a5ceba20b3a>:1> result=<Future pending>>

【问题讨论】:

    标签: xml asynchronous python-asyncio


    【解决方案1】:

    有两个问题:

    • 您需要通过await 呼叫reqFundamentalDataAsync。这就是为什么你得到一个未决的未来,它是 reqFundamentalDataAsync 的返回值(当没有等待时),因此是你的 ReportsFinStatements

    • 您需要使用asyncio.gather() 而不是asyncio.wait(),在这种情况下您不需要在返回值上调用result()。 (一旦实现了前一点,您可以按照您的尝试使用asyncio.wait(),并在任务上调用result(),但asyncio.gather() 的设计目的是让您不必这样做。 )

    最后,您不需要显式使用create_taskasyncio.gatherasyncio.wait 在传递协程对象时会自动为您使用。例如,您可以这样写main

    async def main():
        return await asyncio.gather(
            ReportsFinStatements('PIH', 'SMART', 'USD', 'NASDAQ'),
            ReportsFinStatements('PIH', 'SMART', 'USD', 'NASDAQ'),
            ReportsFinStatements('PIH', 'SMART', 'USD', 'NASDAQ'))
    

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2014-06-29
    • 2020-09-15
    • 2018-07-11
    • 2011-08-09
    相关资源
    最近更新 更多