0

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

我有一个线程专门用于循环做一些工作。它所做的工作来自数据库,并且获取消息的调用被阻塞:

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标志,当主线程退出时将其杀死,但我想知道是否有更好的机制或设计方式?

4

2 回答 2

0

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

while True:
    message = self.db.get()
    if instance(message, base string) and message == 'stop':
        break
    ...
于 2013-05-01T15:16:07.030 回答
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()
于 2013-05-01T15:19:12.240 回答