我有一个程序从数据库中提取“工作”,然后将其发送给工作人员。
我有一个致力于在循环中完成一些工作的线程。它所做的工作来自数据库,并且获取消息的调用是阻塞的:
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
标志,当主线程退出时会将其杀死,但我想知道是否有更好的机制或设计方法?
答案 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()