这个非常小的脚本在执行后冻结:
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
答案 0 :(得分:1)
为什么它没有终止并不明显,但这给出了一个提示:
close()
指示当前进程不再将此数据放入此队列。一旦将所有缓冲数据刷新到管道,后台线程将退出。当队列被垃圾收集时会自动调用此方法
这意味着上面的代码创建了一个后台线程来处理队列。代码结束时,Python会尝试关闭队列。队列处理程序将尝试刷新队列,但没有收件人(Process
),因此它会挂起。
答案 1 :(得分:1)
我设法使用cancel_join_thread
(manual):
警告:如上所述,如果子进程已将项目放在a上 然后,队列(并且它没有使用JoinableQueue.cancel_join_thread) 在所有缓冲项都存在之前,该进程不会终止 冲到管道上。
这意味着如果您尝试加入该流程 你可能会陷入僵局,除非你确定所有的项目都有 被放在队列上已被消耗。同样,如果孩子 进程是非守护进程,然后父进程可能会在退出时挂起 它试图加入所有非守护儿童。
但这并不能解释为什么它会发生10000件物品,而不是1000件物品。所以我很想知道更多关于它的信息,也许有人可以更详细地了解这一点。