2017-07-24 26 views
0

我是python的新手,我想用pool.apply_async()來校準我的代碼。 pool.apply_async()的參數讓我困惑。使用關於pool.apply_async

這裏是我的代碼:

def detect(i, pdf): 
    savefig2pdf.save(event['value'][0][5000:6000], 
       event['value'][1][5000:6000], 
       event['value'][2][5000:6000], 
       event['start point index']+5000 , 
       eventlist[i], 
       p_result, 
       s_arrival, 
       pdf)" 

if __name__ == '__main__': 
    pdf = PdfPages('cut_figure.pdf') 
    pool = multiprocessing.Pool(processes=10) # set the processes max number 10 
    for i in range(0, len(eventlist)): 
     pool.apply_async(detect, (i, pdf,)) 
    pool.close() 
    pool.join() 
    pdf.close() 

如果我只有通過i,它的工作原理。我怎樣才能將PDF傳遞給流程?我需要pdf才能寫出,直到完成所有過程。 感謝您的幫助。

+0

你看到的確切錯誤信息是什麼?你能顯示「檢測」的前幾行嗎? – mbatchkarov

+0

實際上沒有錯誤消息...如果我只通過我檢測,它工作正常。如果我通過PDF和我,代碼不處理檢測功能 – rhy

+0

我認爲這發生在多個進程共享「pdf」對象時。或者你的'detect'函數可能會拋出一個異常。 – Himal

回答

2

multiprocessing模塊依靠pickle序列化您在函數之間傳遞的對象。但你不能酸洗pdf對象:

>>> from matplotlib.backends.backend_pdf import PdfPages 
>>> import pickle 
>>> pdf = PdfPages('cut_figure.pdf') 
>>> pickle.dumps(pdf) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-5-e06adaa58666> in <module>() 
----> 1 pickle.dumps(pdf) 

TypeError: cannot serialize '_io.BufferedWriter' object 

所以這是不可能使用multiprocessing與單個pdf對象。您可以嘗試使用threading來獲得多線程執行,因爲您的程序似乎是IO綁定的(您花費大量時間寫入文件)。