0
我已经在python中编写了一个生产者线程,并且我希望在设置某个事件时停止它的执行。我不知道如何使用threading.Event
这个举措。所以,我自己写了一些代码: -在python生产者线程中删除shouldStop变量的使用
我已经使用了一个默认设置为False的self.shouldStop
变量。每当我想停止生产者线程的执行,我设置p.shouldStop
为True
import Queue
import threading
import time
class ProducerThread(threading.Thread):
def __init__(self, q):
super(ProducerThread, self).__init__()
self._q = q
self.shouldStop = False
def run(self):
for i in range(5):
if self.shouldStop is True:
return
self._q.put(i)
class ConsumerThread(threading.Thread):
def __init__(self, q):
super(ConsumerThread, self).__init__()
self._q = q
def run(self):
while True:
data = self._q.get()
if data == 'Stop':
print 'returning from the thread as I got %s message' % data
return
print "%s got %s. Sleeping for %s seconds. %s" % (self.getName(), data, data, time.time())
time.sleep(data)
print "%s woke up from sleep after %s seconds %s" % (self.getName(), data, time.time())
def stop(self):
self._q.put("Stop")
if __name__ == '__main__':
q = Queue.Queue(1)
p = ProducerThread(q)
t = ConsumerThread(q)
p.start()
t.start()
p.shouldStop = True
p.join()
t.stop()
t.join()
我的问题是:
是否存在被删除使用shouldStop
和使用threading.Event
实现这一目标的任何更好的办法?
在消费者线程,Shoudnt了'GET'在'else'部分发生。这是因为如果Producer的'put'完成了,但Consumer中的get'仍然在等待队列中的某些数据。在这种情况下,该事件将永远不会到达消费者。我对么? – GodMan
这是正确的,但将'get'移到'else'不会解决问题。假设你将'get'移动到'else':现在'producer'已经完成,但'shutdown_event'还没有设置:消费者'如果self._shutdown_event.is_set()'会评估为'False',那么将会执行'else'并且消费者线程会阻止对'_work_queue.get()'的调用。 –
正确的解决方法是在超时错误的情况下调用带有超时的'get'并检查事件状态。 –