Asyncio返回将来的待定结果

时间:2018-09-25 02:57:43

标签: xml asynchronous python-asyncio

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

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

如何获取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>>

1 个答案:

答案 0 :(得分:2)

有两个问题:

  • 您需要form2 frm2 = new Form2(calledByFrm1: true); frm2.ShowDialog(); // ... class Form2 ... { boolean calledByForm1; public Form2(boolean calledByForm1) { this.calledByForm1 = calledByForm1; } public Form2_Onload .... { if (this.calledByForm1) { // your logic here } } } await的呼叫。这就是为什么您会有一个未决的未来,这就是reqFundamentalDataAsync(未等待时)和reqFundamentalDataAsync的返回值。

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

最后,您不需要显式使用asyncio.gather(),在传递协程对象时,create_taskasyncio.gather都自动为您使用。例如,您可以这样编写asyncio.wait

main