2017-07-24 1 views
0

Ich bin neu in Python, und ich möchte pool.apply_async() verwenden, um meinen Code zu kalibrieren. Die Parameter von pool.apply_async() haben mich verwirrt.Verwenden von über pool.apply_async

Hier ist mein Code:

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() 

Wenn ich nur die i passieren, es funktioniert. Wie kann ich die PDF-Prozesse auch an Prozesse weitergeben? Ich brauche das pdf, um schreiben zu können, bis der ganze Prozess fertig ist. Danke für Ihre Hilfe.

+0

Was ist die genaue Fehlermeldung, die Sie sehen? Können Sie die ersten Zeilen von 'detect' anzeigen? – mbatchkarov

+0

tatsächlich gibt es keine Fehlermeldung ... wenn ich nur passiere, um zu erkennen, funktioniert es gut. wenn ich pdf und ich überlasse, verarbeitet Code nicht die ermittelnfunktion – rhy

+0

ich denke, dass es geschieht, wenn es das 'pdf' Objekt über mehrfache Prozesse teilt. oder Ihre 'detect' Funktion könnte eine Ausnahme auslösen. – Himal

Antwort

2

Das Modul multiprocessing basiert auf pickle, um das zwischen den Funktionen übergebene Objekt zu serialisieren. Aber man kann nicht beizt das pdf Objekt:

>>> 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 

So ist es nicht möglich ist, multiprocessing mit einem einzigen pdf Objekt zu verwenden. Sie können versuchen, threading zu verwenden, Multi-Threaded-Ausführung zu erhalten, da Ihr Programm IO gebunden scheint (Sie verbringen viel Zeit in einer Datei schreiben).

Verwandte Themen