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

时间:2017-01-02 14:07:37

标签: python web-services tornado

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

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

虽然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)

1 个答案:

答案 0 :(得分:0)

我只是添加try except block,因为当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)