Python Tornado Web 服务,用于长时间运行的进程



我想编写一个在后台处理请求的Web服务。该服务将请求放入队列中并立即响应客户端。

我在下面的代码中的问题是 while 循环在 BackgroundThread().run() 函数中不起作用。

而 BackgroundThread.run() 方法中的循环不像无限。它只进入 while 循环一次。

谢谢。

法典:

class BackgroundThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        global queue
        while True:
            item = queue.get()
            if item is not None:
                #long running process
                time.sleep(random.randint(10, 100) / 1000.0)
                print "task", item, "finished"
queue = Queue.Queue()
class MyHandler(tornado.web.RequestHandler):
    @gen.coroutine
    def get(self):
        global queue
        self.write('OK')
        self.finish()
        filePath = self.get_arguments("filePath")
        queue.put(filePath)
        print queue.qsize()
if __name__=='__main__':
    try:
        BackgroundThread().start()
        BackgroundThread().start()
        app = tornado.web.Application([(r'/', MyHandler)])
        print("server opened on port : 8000")
        server = tornado.httpserver.HTTPServer(app)
        server.bind(8000)
        server.start(4) # Specify number of subprocesses
        tornado.ioloop.IOLoop.current().start()
    except KeyboardInterrupt:
        print '^C received, shutting down the web server'
        sys.exit(1)

我只是添加 try except 块,因为当队列在 while 循环中为空时,它会得到异常并且不会迭代。

我得到了答案,这是代码:

class BackgroundThread(threading.Thread):
def __init__(self):
    threading.Thread.__init__(self)
def run(self):
    global queue
    print("qwerqwer0")
    while 1==1:
        print("qwerqwer1")
        print("qwerqwer2")
        try:
            item = queue.get()
            queue.task_done()
        except Queue.Empty:
            print("empty")
            pass
        if item is not None:
            print("qwerqwerqwer")
            #long running process
            print "task ", item, " finished"
queue = Queue.Queue()
class MyHandler(tornado.web.RequestHandler):
    @gen.coroutine
    def get(self):
        global queue
        self.write('OK')
        self.finish()
        filePath = self.get_arguments("filePath")
        queue.put(filePath)
        print queue.qsize()
if __name__=='__main__':
    try:
        #BackgroundThread().start()
        BackgroundThread().start()
        app = tornado.web.Application([(r'/', MyHandler)])
        print("server opened on port : 8000")
        server = tornado.httpserver.HTTPServer(app)
        server.bind(8000)
        server.start(4) # Specify number of subprocesses
        tornado.ioloop.IOLoop.current().start()
    except KeyboardInterrupt:
        print '^C received, shutting down the web server'
        sys.exit(1)

最新更新