Muszę uruchomić funkcję w procesie, który jest całkowicie odizolowany od wszystkich innych pamięci, kilka razy. Chciałbym użyć do tego celu multiprocessing
(ponieważ potrzebuję serializować złożone dane pochodzące z funkcji). Ustawiłem start_method
na 'spawn'
i używam puli z maxtasksperchild=1
. Spodziewam się, aby uzyskać inny proces dla każdego zadania, a zatem zobaczyć inny PID:multiprocessing.Pool z maxtasksperchild daje równe PID
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()
Jednak wyjście pojawia się:
$ 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
...
więc procesy nie są respawnowane po wyjsciu każdego zadania . Czy istnieje automatyczny sposób uzyskiwania nowego PID za każdym razem (tj. Bez uruchamiania nowej puli dla każdego zestawu procesów)?