我正在尝试使用 Tornado 的 gen.coroutine
函数进行简单的异步调用。这是我当前的代码:
from tornado import gen
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
q = self.get_argument('query')
print q
response = yield self.process(q)
self.write(response)
@gen.coroutine
def process(self, query):
# just a long loop
for i in range(int(query)*100):
for j in range(i):
a = 10*10*10*10*10*10
return {'processed': True}
def make_app():
return tornado.web.Application([
(r"/search", MainHandler),
])
if __name__ == "__main__":
app = make_app()
port = 8888
print "listening on port: ", port
app.listen(port)
tornado.ioloop.IOLoop.current().start()
但是,它并不是以异步方式运行的。我做错了什么?
最佳答案
您的函数正在阻塞事件循环,在 process()
函数完成或将控制权交还给事件循环之前,无法处理其他任务。对于这种情况,您可以简单地使用 yield None
(以前是 yield gen.moment
)来休息一下,让事件循环运行其他任务,然后继续处理.示例:
@gen.coroutine
def process(self, query):
for i in range(int(query)*100):
for j in range(i):
a = 10*10*10*10*10*10
if j % 500 == 0:
yield None # yield the inner loop
if i % 500 == 0:
yield None # yield outer loop
return {'processed': True}
希望这可以帮助您实现所需的并发级别。
引用资料
http://www.tornadoweb.org/en/stable/gen.html#tornado.gen.moment
关于python - 使用 Tornado Python 进行异步函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44139848/