如何在tornad中使用Asynchttp

2024-09-28 21:24:19 发布

您现在位置:Python中文网/ 问答频道 /正文

AsynceHTTPClient不是非阻塞客户机?你知道吗

当我使用请求获取响应时,它工作。但是当我使用asyncttttpclient发布请求时,它不起作用。你知道吗

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个请求,然后再接收响应,但是每次响应之后我都会得到每个响应。它不是非阻塞模式 我的代码有问题吗?我该怎么办?你知道吗


Tags: clientloophttpurlgoasync客户机request
2条回答

200是你的状态码。就像是

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

当您从打印中删除您的状态码时,应该是正在打印

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

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

您可以使用^{}一次发送所有请求,真正地异步发送。你知道吗

正如文件所说:

If you need to get the result of each future as soon as possible, or if you need the result of some futures even if others produce errors, you can use 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关于这个的文章。你知道吗

相关问题 更多 >