在哪里加入在异步龙卷风请求处理程序中创建的线程?

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)似乎在显示任何输出之前等待连接关闭,这让我暂时离开了.