簡體   English   中英

多處理腳本卡住

[英]Multiprocessing script gets stuck

我有以下Python代碼:

def workPackage(args):
   try:      
    outputdata                  = dict()
    iterator                        = 1
    for name in outputnames:
        outputdata[name]            = []
    for filename in filelist:
        read_data                   = np.genfromtxt(filename, comments="#", unpack=True, names=datacolnames, delimiter=";")
        mean_va1                    = np.mean(read_data["val1"])
        mean_va2                    = np.mean(read_data["val2"])
        outputdata[outputnames[0]].append(read_data["setpoint"][0])
        outputdata[outputnames[1]].append(mean_val1)
        outputdata[outputnames[2]].append(mean_val2)        
        outputdata[outputnames[3]].append(mean_val1-mean_val2)
        outputdata[outputnames[4]].append((mean_val1-mean_val2)/read_data["setpoint"][0]*100)
        outputdata[outputnames[5]].append(2*np.std(read_data["val1"]))
        outputdata[outputnames[6]].append(2*np.std(read_data["val2"]))      


        print("Process "+str(identifier+1)+": "+str(round(100*(iterator/len(filelist)),1))+"% complete")
        iterator    = iterator+1

    queue.put (outputdata)
 except:
 some message

if __name__ == '__main__':
"Main script"

該代碼用於評估大量測量數據。 總共我在多個目錄中獲得了約900個文件(總計約13GB)。 主腳本確定所有文件路徑並將其存儲在4個塊中。 每個塊(文件路徑列表)都分配給一個進程。

    try:
      print("Distributing the workload on "+str(numberOfProcesses)+" processes...")                     
      for i in range(0,numberOfProcesses):
        q[i]                = multiprocessing.Queue()
        Processes[i]        = multiprocessing.Process(target=workPackage, args=(filelistChunks[i], colnames, outputdatanames, i, q[i]))
        Processes[i].start()
      for i in range(0,numberOfProcesses):
        Processes[i].join()
    except:
       print("Exception while processing stuff...")

之后,從隊列中讀取restul,並將其存儲到輸出文件中。 現在這是我的問題:該腳本啟動了4個進程,每個進程都運行到100%(請參閱workPackage函數中的打印內容)。 他們不會同時完成,但要在大約2分鍾內完成。 但是隨后腳本就停止了。 如果我僅通過剪切文件列表來限制要處理的數據量,則該文件有時會運行到最后,但有時沒有。 我不明白,為什么腳本在所有進程達到100%之后就卡住了。

我真的不知道那里發生了什么。

您使用queue.put()將項目添加到隊列中,然后調用queue.join(),但是我看不到您在哪里調用queue.get()或queue.task_done()。 在隊列為空並且在每個項目上調用task_done()之前,join不會釋放線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM