gpt4 book ai didi

python - Tornado 异步 http 客户端 block

转载 作者:太空宇宙 更新时间:2023-11-03 16:50:57 33 4
gpt4 key购买 nike

theQueue = tornado.queues.Queue()
theQueue.put_nowait('http://www.baidu.com')
theQueue.put_nowait('http://www.google.com')
theQueue.put_nowait('http://cn.bing.com/')

@tornado.gen.coroutine
def Test1():
def cb(response):
print str(response)

while True:
item = yield theQueue.get()
print item
tmp = tornado.httpclient.AsyncHTTPClient(force_instance=True)
tmp.fetch(item,callback=cb)

@tornado.gen.coroutine
def Test2():
while True:
item = yield theQueue.get()
print item
tmp = tornado.httpclient.AsyncHTTPClient(force_instance=True)
response = yield tmp.fetch(item)
print str(response)

#Test1()
Test2()
tornado.ioloop.IOLoop.instance().start()

Python 2.6 和 Tornado 4.2
在函数 Test1 中,它会首先打印 3 个项目,然后打印 3 个响应。
但在Test2中,它将一一打印项目及其响应。

我很困惑,为什么在 Test2 中不是异步的?

最佳答案

Test2() 是异步的,但是以不同的方式,协程方式。

Tornado 的协程在遇到 yield 关键字时暂停,等待异步过程(在您的情况下,通过 http 客户端请求网页)完成。 当当前协程挂起时,tornado 将切换到其他可用的协程。

使用协程,您的代码看起来是同步的,并且“运行同步”(如果只有一个协程)。

您可以通过使用两个或多个协程轻松测试tornado协程的异步功能:

@tornado.gen.coroutine
def Test2():
while True:
item = yield theQueue.get()
print 'Test2:', item
tmp = tornado.httpclient.AsyncHTTPClient(force_instance=True)
response = yield tmp.fetch(item)
print 'Test2:', str(response)

# Write another test function called `Test3` and do the exactly same thing with Test2.
@tornado.gen.coroutine
def Test3():
while True:
item = yield theQueue.get()
print 'Test3:', item
tmp = tornado.httpclient.AsyncHTTPClient(force_instance=True)
response = yield tmp.fetch(item)
print 'Test3:', str(response)

Test2()
Test3()
tornado.ioloop.IOLoop.instance().start()

在此示例中,您将看到 Test2 和 Test3 同时运行(但不是真的)

在不同例程之间切换以执行并发操作的能力,这就是协程异步的意义。

关于python - Tornado 异步 http 客户端 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35839064/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com