在python中退出一个线程?

时间:2013-05-01 14:34:57

标签: python multithreading python-multithreading

我有一个程序从数据库中提取“工作”,然后将其发送给工作人员。

我有一个致力于在循环中完成一些工作的线程。它所做的工作来自数据库,并且获取消息的调用是阻塞的:

class MessageThread(Thread):
    def __init__(self, db, worker_inbox, *args, **kwargs):
        super(MessageThread, self).__init__(*args, **kwargs)
        self.db = db
        self.worker_inbox = worker_inbox  # this is a stdlib Queue.Queue

    def run(self):
        while True:
            message = self.db.get()
            self.worker_inbox.put(message)

无需将一些“标志”放入数据库,是否有一种很好的方法来阻止这个线程?目前我在其上设置daemon标志,当主线程退出时会将其杀死,但我想知道是否有更好的机制或设计方法?

2 个答案:

答案 0 :(得分:0)

让您的代码在队列中查找唯一的停止消息。如果它通常传递一些对象,那么一个表示“停止”的字符串是一种很好的快速自我记录方式。当它终止工作人员的时候,只需将“停止”放入队列即可。这会唤醒线程并告诉它完成。您可以使用布尔值,无或适合您传递的消息。

while True:
    message = self.db.get()
    if instance(message, base string) and message == 'stop':
        break
    ...

答案 1 :(得分:0)

如果db是一个消息队列,那么我只是将一些“退出”假消息放到这个队列中。 这是一些伪代码看起来如何。

class MessageThread(Thread):
    def __init__(self, db, worker_inbox, *args, **kwargs):
        super(MessageThread, self).__init__(*args, **kwargs)
        self.db = db
        self.worker_inbox = worker_inbox  # this is a stdlib Queue.Queue

    def run(self):
        while True:
            message = self.db.get()
            if "quit" == message:
                return
            self.worker_inbox.put(message)
    def quit(self):
        self.db.put("quit")

 a = MessageThread()
 a.start()
 sleep(1.0)
 a.quit()
 a.join()