2015-06-19 23 views
8

Bir işlemde, tüm diğer bellekten tamamen izole edilen bir işlevi çalıştırmam gerekir. Bunun için multiprocessing'u kullanmak istiyorum (çünkü fonksiyonlardan gelen karmaşık bir çıkışı serileştirmem gerekiyor). start_method'u 'spawn''a ayarlıyorum ve maxtasksperchild=1 ile bir havuz kullanın. Her görev için farklı bir süreç olsun bekliyoruz ve bu nedenle farklı bir PID görecekti: alıyorum çıkışı Ancakçok işlemcili maxtasksperchild ile eşittir PID'ler üretir

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

Yani süreçler her görevi sonrasında respawned edilmiyor . Her seferinde yeni bir PID almanın otomatik bir yolu var mı (yani her bir süreç kümesi için yeni bir havuz oluşturmadan)?

cevap

9

Ayrıca pool.map aramasına chunksize=1 belirtmeniz gerekir.

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

Çıktı şimdi Pıd tekrarlanan sahip değil:

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 
Aksi takdirde, iterable içinde birden çok öğe alt işlemlerin algı itibaren bir "görev" altında gruplanır olsun
İlgili konular