Ответ 1
Я считаю, что Thread.join()
будет блокироваться до тех пор, пока поток не закончится, возможно, чего-то, чего вы хотите избежать. Вместо того, чтобы присоединяться, вы можете иметь обратный вызов потока для обработчика.
При использовании потоков помните, что торнадо не является потокобезопасным, поэтому вы не можете использовать какие-либо методы 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), похоже, ждут закрытия соединения, прежде чем отображать какой-либо вывод, который немного отбросил меня.