我正在使用一个名为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>>
答案 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_task
和asyncio.gather
都自动为您使用。例如,您可以这样编写asyncio.wait
:
main