2015-06-19 34 views
8

我需要在一個進程中運行一個函數,它與其他所有內存完全隔離幾次。我想使用multiprocessing(因爲我需要序列化來自函數的複雜輸出)。我將start_method設置爲'spawn'並使用maxtasksperchild=1。我希望讓每個任務不同的過程,因此,看到一個不同的PID:multiprocessing.Pool與maxtasksperchild產生相等的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() 

但是輸出我得到的是:

$ 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 
... 

所以進程不會被每個任務後重生。是否有一種每次都獲得新PID的自動方法(即,不爲每組進程啓動一個新池)?

回答

9

您還需要在致電pool.map時指定chunksize=1。否則,你可迭代的多個項目將捆綁在一起成爲一個「任務」,從工作進程的看法:

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

輸出不重複的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