Mi dispiace se questo è troppo semplice per alcune persone, ma non riesco ancora a ottenere il trucco con il multiprocessing di Python. Ho letto
http://docs.python.org/dev/library/multiprocessing
http://pymotw.com/2/multiprocessing/basics.html e molti altri tutorial ed esempi che google mi dà ... molti di loro anche da qui.Multiprocessing di Python per processi paralleli
Bene, la mia situazione è che devo calcolare molte matrici numpy e ho bisogno di memorizzarle in una singola matrice numpy in seguito. Diciamo che voglio usare 20 core (o che posso usare 20 core) ma non sono riuscito a utilizzare correttamente la risorsa del pool poiché mantiene i processi attivi finché il pool "muore". Così ho pensato di fare qualcosa di simile:
from multiprocessing import Process, Queue
import numpy as np
def f(q,i):
q.put(np.zeros((4,4)))
if __name__ == '__main__':
q = Queue()
for i in range(30):
p = Process(target=f, args=(q,))
p.start()
p.join()
result = q.get()
while q.empty() == False:
result += q.get()
print result
ma poi sembra che i processi non vengono eseguiti in parallelo, ma corrono in sequenza (per favore correggetemi se sbaglio) e non so se muoiono dopo aver fatto il loro calcolo (quindi per più di 20 processi quelli che hanno fatto la loro parte lasciano il core libero per un altro processo). Inoltre, per un numero molto grande (diciamo 100.000), l'archiviazione di tutte quelle matrici (che possono essere anche molto grandi) in una coda utilizzerà molta memoria, rendendo il codice inutile poiché l'idea è di mettere ogni risultato su ogni iterazione nel risultato finale, come usare un lock (e i suoi metodi acquire() e release()), ma se questo codice non è per l'elaborazione parallela, il blocco è inutile anche ...
Spero che qualcuno possa aiutare me.
Grazie in anticipo!
Grazie per la risposta! Capisco la prima soluzione in più, e trovo la callback estremamente utile poiché imap_unordered sembra archiviare tutti i risultati, ed è quello che non vorrei fare per non mangiare memoria. Per quanto riguarda il pool, non sono sicuro (a causa di ciò che ho letto sull'attributo maxtasksperchild) che se ho processori "x", i processi "3x" verranno eseguiti poiché i "primi" processi "x" non muoiono.Non sono nemmeno sicuro se la memoria allocata per i primi processi "x" sia libera dopo il callback. Chiedo di non "bloccare" il mio pc quando si utilizzano molte più grandi matrici – Carlos
Oh! Penso che ora capisco: gli operai sono vivi finchè la piscina è viva, ma non appena finiscono un processo liberano le risorse e poi prendono il processo successivo e fanno il calcolo ... È così? – Carlos
Sì, questo è tutto. Non mi preoccuperei troppo di "Pool" o di trovare un sostituto a meno che non si disponga di dati di profilazione che indicano che si tratta di un problema. Ci sono ottimizzazioni che puoi fare, ma finché non avrai dimostrato che c'è un problema nel tuo sistema reale, la maggior parte di esse non vale la pena. –