Ho bisogno di eseguire una funzione in un processo, che è completamente isolata da tutte le altre memorie, più volte. Vorrei usare multiprocessing
per quello (dal momento che ho bisogno di serializzare un output complesso proveniente dalle funzioni). Impostare start_method
su 'spawn'
e utilizzare un pool con maxtasksperchild=1
. Mi aspetto di ottenere un processo diverso per ogni attività, e quindi vedere un PID differente:multiprocessing.Pool con maxtasksperchild produce PID uguali
import multiprocessing
import time
import os
def f(x):
print("PID: %d" % os.getpid())
time.sleep(x)
complex_obj = 5 #more complex axtually
return complex_obj
if __name__ == '__main__':
multiprocessing.set_start_method('spawn')
pool = multiprocessing.Pool(4, maxtasksperchild=1)
pool.map(f, [5]*30)
pool.close()
Tuttavia l'output che ottengo è:
$ python untitled1.py
PID: 30010
PID: 30009
PID: 30012
PID: 30011
PID: 30010
PID: 30009
PID: 30012
PID: 30011
PID: 30018
PID: 30017
PID: 30019
PID: 30020
PID: 30018
PID: 30019
PID: 30017
PID: 30020
...
Così i processi non vengono respawned dopo ogni operazione . Esiste un modo automatico per ottenere ogni volta un nuovo PID (ovvero senza iniziare un nuovo pool per ogni insieme di processi)?