Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 龙卷风不能正确地产生期货_Python_Tornado_Future_Yield_Aiohttp - Fatal编程技术网

Python 龙卷风不能正确地产生期货

Python 龙卷风不能正确地产生期货,python,tornado,future,yield,aiohttp,Python,Tornado,Future,Yield,Aiohttp,我需要在tornado请求处理程序中异步进行几个http调用 在tornado的处理程序级别上,在收集的asyncio.gather上尝试返回期货没有很好的文档记录,而且几乎不可能完成 我已经尝试过aiohttp,它本身工作得很好,但是当把它放在龙卷风处理程序中时,它抛出的循环已经在使用了。如果你能告诉我如何向IOLoop注入一些新的未来来解决这个问题,那就太好了 我还尝试过使用tornadosAsyncHTTPClient,与文档相反,它实际上不使用yield,而是在使用wait时返回响应 这

我需要在tornado请求处理程序中异步进行几个http调用

在tornado的处理程序级别上,在收集的asyncio.gather上尝试返回期货没有很好的文档记录,而且几乎不可能完成

我已经尝试过aiohttp,它本身工作得很好,但是当把它放在龙卷风处理程序中时,它抛出的循环已经在使用了。如果你能告诉我如何向IOLoop注入一些新的未来来解决这个问题,那就太好了

我还尝试过使用tornados
AsyncHTTPClient
,与文档相反,它实际上不使用yield,而是在使用wait时返回响应

这方面有最新的文件吗?并非所有示例都适用于多个异步请求

根据这份文件

然而,当自己尝试这样做时,yield抛出了一个错误,用wait替换它会得到一个结果。然而,你不能等待一个dict对象像产量可以。我怎样才能避开这件事

python 3.6.7 龙卷风5.1.1
aiohttp 3.5.4

您的评论使用了
await
这个词,所以听起来您好像遇到了本机协同程序(用
async def
await
定义)和装饰协同程序(用
@gen.coroutine
yield
定义)之间的差异。您只能在修饰的协同程序中直接生成列表和词典

在本机协同程序中,必须使用
tornado.gen.multi
(或
asyncio.gather
):


这两种类型的协同路由之间的差异已记录在案

如何运行此协同路由?如果要异步发送多个http请求,请使用。它允许您从列表中生成期货。不久前我回答了一个类似的问题:@xyres为什么我为tornado链接的文档是错误的?它清楚地显示了从一个列表中产生多个期货。莫名其妙。最重要的是,这是一个糟糕的面具,我上面说的话无论如何。您可以创建自己的未来列表,然后
等待它们,而不是屈服或过于复杂的WaitIterator,就像制作糟糕的tornado文档试图告诉您的那样。@xyres要添加到该
WaitIterator
仍然抛出错误
“AssertionError:yield from未与future一起使用\n”
在龙卷风与破碎的土壤相互作用中,有某种内在的破碎asyncio@ErikK首先,冷静下来。其次,
WaitIterator
允许您异步生成/等待期货,这意味着它将在期货得到解决时为您提供未来的结果。然而,如果你只是放弃/等待一份期货清单,你将无法在期货结算时得到结果。只有当所有的未来都解决了,你才会得到结果。谢谢你。我一定错过了区分本机异步和tornados协同路由的一点点地方。我已经有了一个
asyncio.gather
在tornado处理程序之外为多重期货工作。然而,当插入tornado时,我进入了已经运行错误或产生错误的循环。我想你的回答已经得到了我需要的答案,谢谢
@gen.coroutine
def get(self):
    http_client = AsyncHTTPClient()
     response1, response2 = yield [http_client.fetch(url1),
                              http_client.fetch(url2)]
    response_dict = yield dict(response3=http_client.fetch(url3),
                           response4=http_client.fetch(url4))
    response3 = response_dict['response3']
    response4 = response_dict['response4']
async def get(self):
    http_client = AsyncHTTPClient()
    response1, response2 = await gen.multi([http_client.fetch(url1),
                                            http_client.fetch(url2)])
    response_dict = await gen.multi(dict(response3=http_client.fetch(url3),
                                         response4=http_client.fetch(url4)))
    response3 = response_dict['response3']
    response4 = response_dict['response4']