Tornado on_message阻止

时间:2018-01-19 09:00:41

标签: python tornado blocking

我有一个处理器,它的on_message中有一个昂贵的操作。注释掉的线条是我尝试过的不同之处。当有人想要将昂贵的任务放在后面的任务上时,有人可以确认最佳实践吗? 此后台任务最终通过调用IOLoop.instance()。add_callback()来回复客户端,这似乎是推荐的方式。

     class PublisherRequestHandler(websocket.WebSocketHandler):

           executor = futures.ThreadPoolExecutor(max_workers=4)

           def on_message(self, publishRequest):
               #self.queue.put(publishRequest)
               #IOLoop.current().spawn_callback(self.on_message_publish, publishRequest)
               #yield tornado.gen.Task(self.on_message_publish, publishRequest)
               yield PublisherRequestHandler.executor.submit(self.on_message_publish, publishRequest)

           @gen.coroutine
           def on_message_publish(self, publishRequest):

1 个答案:

答案 0 :(得分:0)

大部分时间我都这样使用它:

from tornado import gen
from tornado.concurrent import run_on_executor

executor = futures.ThreadPoolExecutor(max_workers=4) 
class PublisherRequestHandler(websocket.WebSocketHandler):
       @gen.coroutine
       def on_message(self, publishRequest):
           yield self.on_message_publish(publishRequest)

       @run_on_executor
       def on_message_publish(self, publishRequest):
           pass