如何在龙卷风中使用Asynchttp

时间:2019-01-10 08:32:20

标签: python tornado

AsynceHTTPClient不是非阻塞客户端吗?

当我使用请求获取响应时,它起作用。但是当我使用AsyncTTTPClient发布请求时,它不起作用。

async def go():
    print('go---------------')
    client = AsyncHTTPClient()
    request = HTTPRequest(url='http://127.0.0.1:8001/api', 
method='GET',)
    r = await client.fetch(request)
    print(r.code, r.body)

async def m(r):
    for _ in range(r):
        await go()

loop = asyncio.get_event_loop()
loop.run_until_complete(m(100))

当我使用AsyncHTTPClient时,我认为结果就像这样的内容

去---去---去---去--- ......

但实际结果是

走-200 b''走-200 b''.......

我想要一个非阻塞请求,所以它可能先发送所有100个请求,然后再接收响应,但是我在每个响应之后都得到了每个响应。它不是非阻塞模式 我的代码有问题吗?我该怎么办?

2 个答案:

答案 0 :(得分:1)

在这种情况下,您看到的是使用协程的缺点。因为即使请求是非阻塞的,它们也不是真正异步的。

您可以使用gen.WaitIterator一次真正异步地发送所有请求。

如文档所述:

  

如果您需要尽快获取每个期货的结果,或者即使某些期货产生错误,也需要某些期货的结果,则可以使用WaitIterator

它完全适合您的用例。

gen.WaitIterator将任意数量的期货作为参数,并在完成时产生期货。

但是,要使其正常工作,您将需要在for协程内部移动go循环。示例:

from tornado import gen

async def go(r):
    client = AsyncHTTPClient()
    futures = []

    for _ in range(r):
        print('go----------')
        request = HTTPRequest(url='http://127.0.0.1:8001/api', method='GET',)
        futures.append(client.fetch(request))

    async for result in gen.WaitIterator(*futures):
        print(result.code, result.body)

请注意,还有另一种方法可以实现此目的-使用回调。但是,WaitIterator应该比回调更可取。如果您有兴趣,我前段时间写了blog post

答案 1 :(得分:0)

200是您的状态码。就像

go--- r.status_code b'' go--- r.status_code b'' .......

从打印中删除状态代码时,应该正在打印

go--- go--- go--- go--- ......