Я полагаю, Thread.join()
будет блокироваться до тех пор, пока поток не закончится, вероятно, вы хотите этого избежатьВместо присоединения вы можете использовать обратный вызов потока для обработчика.
При использовании потоков помните, что tornado не является потокобезопасным, поэтому вы не можете использовать какие-либо методы RequestHandler (например) из потоков.
Это работает для меня:
import functools
import time
import threading
import logging
import tornado.web
import tornado.websocket
import tornado.locale
import tornado.ioloop
class Handler(tornado.web.RequestHandler):
def perform(self, callback):
#do something cuz hey, we're in a thread!
time.sleep(5)
output = 'foo'
tornado.ioloop.IOLoop.instance().add_callback(functools.partial(callback, output))
def initialize(self):
self.thread = None
@tornado.web.asynchronous
def get(self):
self.thread = threading.Thread(target=self.perform, args=(self.on_callback,))
self.thread.start()
self.write('In the request')
self.flush()
def on_callback(self, output):
logging.info('In on_callback()')
self.write("Thread output: %s" % output)
self.finish()
application = tornado.web.Application([
(r"/", Handler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
Вы можете проверить это с помощью curl --no-buffer localhost:8888
.Некоторые браузеры (Safari), кажется, ждут, пока соединение закроется, прежде чем отображать какие-либо выходные данные, что на некоторое время отбросило меня.