2015-06-19 18 views
8

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

risposta

9

È necessario specificare anche chunksize=1 nella chiamata a pool.map. In caso contrario, più articoli nel tuo iterable vengono raggruppati insieme in un unico "compito" dalla percezione dei processi di lavoro:

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

uscita non hanno ripetuto PID ora:

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