繁体   English   中英

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

[英]Python Tornado web service for long running process

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

我在下面的代码中的问题是,在BackgroundThread()。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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM