Joh*_*ter 10 python multithreading join tornado
这个让我有些困惑.对于龙卷风和蟒蛇的线程来说还是比较新的,所以我可以完全脱离我想要做的事情.
可能最好从一些简化的代码开始:
class Handler(tornado.web.RequestHandler):
def perform(self):
#do something cuz hey, we're in a thread!
def initialize(self):
self.thread = None
@tornado.web.asynchronous
def post(self):
self.thread = threading.Thread(target=self.perform)
self.thread.start()
self.write('In the request')
self.finish()
def on_connection_close(self):
logging.info('In on_connection_close()')
if self.thread:
logging.info('Joining thread: %s' % (self.thread.name))
self.thread.join()
Run Code Online (Sandbox Code Playgroud)
我的问题是on_connection_close永远不会被调用,请求处理得很好.其次,我是否正在以这种方式引入线程?
Col*_*ean 12
我相信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()
Run Code Online (Sandbox Code Playgroud)
你可以测试一下curl --no-buffer localhost:8888.某些浏览器(Safari)似乎在显示任何输出之前等待连接关闭,这让我暂时离开了.