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