[英]Async function call with Tornado Python
我正在尝试使用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()
但是,它不是以异步方式运行。 我在这方面做错了什么?
您的“过程”方法仅进行计算,因此,在“过程”运行时,它永远不会为Tornado的事件循环提供执行其他任务的机会。 龙卷风可以交错并发网络操作,但是,它不能并行运行Python代码。 要并行化“过程”方法之类的函数,需要多个Python子过程。
您的函数正在阻塞事件循环,直到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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.