将许多项放入队列后脚本冻结

时间:2015-05-11 14:05:57

标签: python queue multiprocessing freeze

这个非常小的脚本在执行后冻结:

Date

它正确打印“ok”,但之后就完成了,我必须手动终止进程。我检查了#coding=utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') import xlsxwriter import random # Créater un tableau et un fiche workbook = xlsxwriter.Workbook('tableau.xlsx') worksheeta= workbook.add_worksheet() worksheetb= workbook.add_worksheet() #Fixer le numbre de mesure et le critère Nb_Mesures = 100 critere = 0.03 #Différer la forme format=workbook.add_format() format.set_border(1) format_ave=workbook.add_format() format_ave.set_bold() format_ave.set_align('center') format_num=workbook.add_format() format_num.set_num_format('0.00') format_num.set_align('center') #créerer le worksheeta worksheeta.write('A1', 'Nb_Mesures', format_ave) worksheeta.write('B1', 'angle_aleatoire', format_ave) worksheeta.write('C1', 'angle_mesuré',format_ave) worksheeta.write('D1','erreur',format_ave) worksheeta.set_column(0, 1, 13) worksheeta.set_column(1, 1, 15) worksheeta.set_column(2, 1, 20) worksheeta.set_column(3, 1, 10) #Insérer le data data1 = [] data2 = [] data3 = [] data4 = [] sum1 = 0 sum2 = 0 sum3 = 0 for row in range(1, Nb_Mesures + 1): b = random.randrange(0, 360) c = b*(1+0.02) d = ( - b * 0.02) sum1 += b sum2 += c sum3 += d data1.append(row) data2.append(b) data3.append(c) data4.append(d) ave1 = sum1 / Nb_Mesures ave2 = sum2 / Nb_Mesures ave3 = sum3 / Nb_Mesures #Ecrir les data dans le tableau worksheeta.write_column('A2', data1, format_ave) worksheeta.write_column('B2' ,data2, format_num) worksheeta.write_column('C2', data3, format_num) worksheeta.write_column('D2', data4, format_num) worksheeta.write('A102', 'Average', format_ave) worksheeta.write('B102', ave1, format_num) worksheeta.write('C102', ave2, format_num) worksheeta.write('D102', ave3, format_num) #créer un schéma,below code has the problem charta = workbook.add_chart({'type' : 'line'}) def chart_series(cur_clo): charta.add_series({ 'values': '=Sheeta!$D$'+cur_clo+':$D$'+cur_clo, }) for cline in range(2 , 101): chart_series(str(cline)) worksheeta.insert_chart('F2',charta) charta.set_size({'width': 1000, 'height': 500}) workbook.close() 的输出,它总是返回from multiprocessing import Queue q = Queue() for x in range(10000): q.put("hello") print "ok" 。 如果我添加第二个循环,将所有项目从队列中取出,它就会正确结束:

q.full()

如果我将数字减少到1000,它也会正确结束。那么这里的问题是什么?是否有一些我不知道的限制,或者我是否误解了关于队列的一些基本原因?

修改

如果我使用管道而不是队列,也会发生同样的情况:

False

2 个答案:

答案 0 :(得分:1)

为什么它没有终止并不明显,但这给出了一个提示:

  

close()
  指示当前进程不再将此数据放入此队列。一旦将所有缓冲数据刷新到管道,后台线程将退出。当队列被垃圾收集时会自动调用此方法

这意味着上面的代码创建了一个后台线程来处理队列。代码结束时,Python会尝试关闭队列。队列处理程序将尝试刷新队列,但没有收件人(Process),因此它会挂起。

但是,我期待一个例外。特别是因为 Ctrl + C 不起作用。

答案 1 :(得分:1)

我设法使用cancel_join_threadmanual):

  

警告:如上所述,如果子进程已将项目放在a上   然后,队列(并且它没有使用JoinableQueue.cancel_join_thread)   在所有缓冲项都存在之前,该进程不会终止   冲到管道上。

     

这意味着如果您尝试加入该流程   你可能会陷入僵局,除非你确定所有的项目都有   被放在队列上已被消耗。同样,如果孩子   进程是非守护进程,然后父进程可能会在退出时挂起   它试图加入所有非守护儿童。

但这并不能解释为什么它会发生10000件物品,而不是1000件物品。所以我很想知道更多关于它的信息,也许有人可以更详细地了解这一点。