python - 使用 Tornado Python 进行异步函数调用

标签 python python-2.7 asynchronous tornado

我正在尝试使用 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/

相关文章:

python - 使用 pandas matplotlib 在 x 轴上显示文本描述而不是数字

c++ - 异步 Mysql 连接器

python - 找出数字组合中的最高总和

python - 如何将 Brave 网络浏览器与 python、selenium 和 chromedriver 结合使用?

html - 无法在 Django 1.9 中加载 style.css

python - Pandas 数据帧 to_latex : how to fit tables on a page?

javascript - 从 mongodb nodejs 延迟返回集合数组

javascript - 异步 Redis 和 Promise

python - 跟踪 Django 项目中点击特定 URL 的唯一用户

python - 当新数据接收到套接字时 Windows 断开连接