我使用带队列的线程,循环包含6000个项目,但它突然挂起5000或更多并且永远不会继续,尽管没有线程通过任何异常代码如下所示
def extract_data():
while True:
empty_flag = False
try:
id = q2.get(timeout = 60)
except Empty:
empty_flag = True
if not empty_flag:
"do some processing here"
q2.task_done()
threads_number = 5
q2 = Queue(threads_number * 2)
for i in range(threads_number):
t = Thread(target=extract_data)
t.daemon = True
t.start()
try:
for i,nbd in enumerate(lst[0:],0): --> list contains 6000 itemts
print "%d of %d\r" %(i+1,len(new_nbds)), --> print hangs here in item (5898 of 6000) or hangs when finish and never end (6000 of 6000)
sys.stdout.flush()
q2.put(nbd)
q2.join()
except KeyboardInterrupt:
sys.exit(1)
答案 0 :(得分:0)
您的队列大小适用于10 element
,即使您从五个不同的线程同时弹出6000 element
,也会从循环中推送q2 = Queue(threads_number * 10)
。我怀疑在分别从循环和线程推送和弹出时会出现同步问题并导致死锁。使队列大小更大,可以解决您的问题。与{{1}}
答案 1 :(得分:0)
感谢大家的回复,问题是当一个线程试图使用请求模块下载文档时,requests.get保持无限运行而不返回任何错误或数据,添加stream = True解决了问题