在python中退出线程?

2024-09-28 23:41:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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标志,当主线程退出时,它就会终止,但是我想知道是否有更好的机制或方法来设计它?你知道吗


Tags: 方法self数据库messagedbqueueinit标志
2条回答

让代码在队列中查找唯一的停止消息。如果它通常被传递给某个对象,那么一个表示“stop”的字符串是一种很好的快速自我记录方法。当它的时间终止工人,只要把'停止'到队列中。这会唤醒线程并告诉它已完成。您可以使用布尔值、none或适合您传递的消息的内容。你知道吗

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

如果db是一个消息队列,那么我只会在这个队列中添加一些“quit”假消息。 下面是一些伪代码。你知道吗

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()

相关问题 更多 >