2015-06-19 14 views
8

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)?

Odpowiedz

9

Należy również podać chunksize=1 w wywołaniu pool.map. W przeciwnym razie, wiele elementów w iterable się razem w jednym pakiecie „zadania” z postrzegania procesów roboczych:

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, chunksize=1) 
    pool.close() 

wyjścia nie ma powtarzających się teraz PID:

PID: 4912 
PID: 4913 
PID: 4914 
PID: 4915 
PID: 4938 
PID: 4937 
PID: 4940 
PID: 4939 
PID: 4966 
PID: 4965 
PID: 4970 
PID: 4971 
PID: 4991 
PID: 4990 
PID: 4992 
PID: 4993 
PID: 5013 
PID: 5014 
PID: 5012 
Powiązane problemy