Takže sa snažím urýchliť jednu rutinu pomocou modulu Multiprocessing v Pythone. Chcem byť schopný prečítať niekoľko súborov CSV rozdelením úlohy medzi niekoľko jadier, pre ktoré mám:
def csvreader(string):
from numpy import genfromtxt;
time,signal=np.genfromtxt(string, delimiter=",",unpack="true")
return time,signal
Potom zavolám túto funkciu vyslovením:
if __name__ == "__main__":
for i in range(0,2):
p = multiprocessing.Process(target=CSVReader.csvreader, args=(string_array[i],))
p.start()
Ide o to, že to neukladá žiadny výstup. Prečítal som si všetky fóra online a videl som, že existuje spôsob, ako s multiprocessing.queue, ale nerozumiem mu celkom dobre. Existuje nejaká jednoduchá a priama metóda?
odpovede:
2 pre odpoveď č. 1Vaša najlepšia stávka je multiprocessing.Queue
alebo multiprocessing.Pipe
, ktoré sú navrhnuté presne pre tento problém. Umožňujú vám bezpečne a jednoducho odosielať údaje medzi procesmi.
Ak by ste chceli vrátiť svoj výstup csvreader
funkcie, mali by ste k nemu podať ďalší argument, ktorým je multiprocessing.Queue
prostredníctvom ktorého budú dáta zaslané späť do hlavného procesu. Namiesto return
Ak tieto hodnoty zadáte, umiestnite ich do frontu ahlavný proces ich načíta neskôr. Ak nie sú pripravení, keď sa ich proces pokúša získať, v predvolenom nastavení sa blokuje (čaká), kým nie sú k dispozícii
Vaša funkcia by teraz vyzerala takto:
def cvsreader(string, q):
q.put(np.genfromtxt(string, delimiter=",", unpack="true"))
Hlavnou rutinou by bolo:
if __name__ == "__main__"
q = multiprocessing.Queue()
for i in range(2):
p = multiprocessing.Process(target=csvreader, args=(string_array[i], q,))
p.start()
# Do anything else you need in here
time=np.empty(2,dtype="object")
signal=np.empty(2,dtype="object")
for i in range(2):
time[i], signal[i] = q.get() # Returns output or blocks until ready
# Process my output
Upozorňujeme, že musíte zavolať Queue.get()
pre každý položka, ktorú chcete vrátiť.
Pozrite sa na dokumentáciu k internetu multiprocessing
modul pre viac príkladov a informácií.
0 pre odpoveď č. 2
Pomocou príkladu z úvod do dokumentácie:
if __name__ == "__main__":
pool = Pool(2)
results = pool.map(CSVReader.csvreader, string_array[:2])
print(results)