我正在尝试使用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的事件循环提供处理其他任务的机会。Tornado可以交叉并发网络操作,但是不能并行运行Python代码。要并行化像“process”方法这样的函数,需要多个Python子进程。

关于python - 用Tornado Python进行异步函数调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44139848/

10-13 05:25