我有一个处理器,它的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):
答案 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