1

我对这个队列有点麻烦:

import Queue
import threading

class test(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.request_queue = Queue.Queue()

    def addtoqueue(self, item):
        self.request_queue.put(item)

    def run(self):
        while True:
            item = self.request_queue.get(True)
            print item

这个简单的类实现了一个线程队列。调用test::addtoqueue会将一个项目附加到队列中。线程等待将一个项目添加到队列中 - 并立即打印它并等待下一件事。

我的问题是应用程序关闭。终止线程的最佳方法是什么?我可以使用条件,但我如何等待来自条件的通知或队列中的新项目?

4

3 回答 3

1

我会更改您的 while 循环中的条件,以便它检查局部变量。添加添加终止开关以允许外部进程关闭线程。您可能应该扩展kill_me以以一种很好的方式处理对象及其队列(例如,如果您想在下次运行时存储队列)。

编辑我还在其中添加了一个has_finished变量,因此kill_me应该阻止主进程线程。这应该允许线程在返回主流程之前退出。

我可能把事情复杂化了;)

class test(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.request_queue = Queue.Queue()
        self.is_running = True
        self.has_finished = False   

    def addtoqueue(self, item):
        self.request_queue.put(item)

    def kill_me(self):
        self.is_running = False
        while not self.has_finished:
            pass

    def run(self):
        while self.is_running:
            item = self.request_queue.get(True)
            print item
        self.has_finished = True
于 2011-04-30T00:07:28.550 回答
1

您可以向线程发送一些毒药来杀死它:

poison = None # something you wouldn't normally put in the Queue

class test(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.request_queue = Queue.Queue()

    def kill(self):
        self.addtoqueue(poison)

    def addtoqueue(self, item):
        self.request_queue.put(item)

    def run(self):
        while True:
            item = self.request_queue.get(True)
            if item is poison:
                # do stuff
                return # end thread
            print item
于 2011-04-30T00:16:01.650 回答
1

做可能有效的最简单的事情——在这种情况下,它可能是一个哨兵。尽管threading受到 Java 的线程库的启发,但在 Python 中,最简单的事情不是做类似 Java 的事情并继承自threading.Thread,而是将函数及其参数传递给threading.Thread()

DONE = object() # Sentinel

def run(queue):
    while True:
        item = queue.get()
        queue.task_done()
        if item is DONE:
            break
        print item

request_queue = Queue.Queue()
some_thread = Thread(target=run, args=(request_queue,))

some_thread.start()

request_queue.put('hey')
request_queue.put('joe')
request_queue.put(DONE)
于 2011-04-30T00:36:07.477 回答