Quando si esegue un numero elevato di attività (con parametri di grandi dimensioni) utilizzando Pool.apply_async, i processi vengono allocati e passano allo stato di attesa e non vi è alcun limite per il numero di processi in attesa. Questo può finire mangiando tutta la memoria, come nell'esempio qui sotto:Multiprocessing di Python: come limitare il numero di processi in attesa?
import multiprocessing
import numpy as np
def f(a,b):
return np.linalg.solve(a,b)
def test():
p = multiprocessing.Pool()
for _ in range(1000):
p.apply_async(f, (np.random.rand(1000,1000),np.random.rand(1000)))
p.close()
p.join()
if __name__ == '__main__':
test()
Sto cercando un modo per limitare la coda di attesa, in modo tale che non v'è solo un numero limitato di processi in attesa, e Pool.apply_async è bloccato mentre la coda di attesa è piena.
Bell'esempio (+1). – mgilson