使用tornado.web.RequestHandler的简单多线程示例

时间:2016-08-13 17:33:19

标签: python asynchronous tornado

我有mysterious_library,提供同步功能query_resource_for_a_long_time

然后我有下面的代码应该异步获取资源:

import tornado.ioloop
import tornado.web

import threading
from mysterious_library import query_resource_for_a_long_time, ResourceNotFoundException

def resource_fetcher(set_status, finish):
    try:
        resource = query_resource_for_a_long_time()

    except ResourceNotFoundException:
        tornado.ioloop.IOLoop.instance().add_callback(set_status, 404)
        tornado.ioloop.IOLoop.instance().add_callback(finish, 'not found')

    else:
        tornado.ioloop.IOLoop.instance().add_callback(set_status, 200)
        tornado.ioloop.IOLoop.instance().add_callback(finish, str(resource))

class Handler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self):
        threading.Thread(
            target=resource_fetcher,
            args=[self.set_status, self.finish]
        ).start()


tornado.web.Application([
    (r'.*', Handler),
]).listen(8765)
tornado.ioloop.IOLoop.instance().start()

但是,似乎该进程在query_resource_for_a_long_time返回之前被阻塞,尽管该函数在一个单独的线程中运行。

我是龙卷风的新手,我想知道是否有可能同时处理这些请求。

1 个答案:

答案 0 :(得分:1)

是,按照说明使用ThreadPoolExecutor:

http://www.tornadoweb.org/en/stable/guide/coroutines.html#calling-blocking-functions

请注意,当您对此进行测试时,您只能从浏览器中同时运行几个查询:

http://www.tornadoweb.org/en/stable/faq.html#my-code-is-asynchronous-but-it-s-not-running-in-parallel-in-two-browser-tabs

...如果你想向自己证明你可以在龙卷风中同时在许多线程中运行神秘的长时间运行功能,那么试试wget或curl。