簡體   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