所以我有一个队列:
q = Queue.Queue()
我在里面放了一些东西。
items = ["First", "Second"]
for val in items:
q.put(val)
我正在产生 15 个线程。
for i in range(15):
tname = 't-%s' % i
t = my_thread(some_func, q, tname)
t.start()
q.join()
my_thread 类如下所示:
class my_thread(threading.Thread):
def __init__(self, some_func, q_, name=''):
threading.Thread.__init__(self)
self.func = some_func
self.process_q = q_
self.name = name
self.prefix = name
def run(self):
stime = time.time()
logging.info('%s thread staring at : %s' % (threading.currentThread().getname(), time.ctime(stime)))
while True:
if self.process_q.empty():
break
queue_item = self.process_q.get()
self.name = self.prefix + '-' + queue_item
try:
#run the function
except Exception as e:
logging.error('Caught some error')
finally:
self.process_q.task_done()
endTime = time.time()
logging.info('%s thread finished at: %s' % (threading.currentThread().getName(), time.ctime(endTime)))
如果我查看日志,我看到的是两个或多个线程同时访问队列,并且当队列为空时,while 循环不会中断。
假设线程已从队列t-0
中取出项目。"first"
但是t-2
线程可能会在线程可以获取"second"
之前获取该项目t-1
,从而使队列为空......但是当检查时,队列t-1
不self.process_q.empty()
为空。所以t-1
线程永远不会退出/完成并挂起。
如果我对进程 ID 进行 strace,我会得到以下信息:
Process 13307 attached
futex(0x2a5fcc0, FUTEX_WAIT_PRIVATE, 0, NULL
我该如何解决这个问题???