2015-06-19 8 views
8

मुझे एक प्रक्रिया में एक फ़ंक्शन चलाने की आवश्यकता है, जो कई अन्य स्मृति से पूरी तरह से अलग है। मैं इसके लिए multiprocessing का उपयोग करना चाहता हूं (क्योंकि मुझे कार्यों से आने वाले जटिल आउटपुट को क्रमबद्ध करने की आवश्यकता है)। मैंने start_method को 'spawn' पर सेट किया है और maxtasksperchild=1 वाले पूल का उपयोग किया है। मैं प्रत्येक कार्य के लिए एक अलग प्रक्रिया पाने के लिए उम्मीद करेंगे, और इसलिए एक अलग पीआईडी ​​देखें:multiprocessing.Pool maxtasksperchild के साथ बराबर पीआईडी ​​

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

तो प्रक्रियाओं हर काम के बाद respawned नहीं किया जा रहा है । क्या हर बार एक नया पीआईडी ​​प्राप्त करने का एक स्वचालित तरीका है (यानी प्रक्रियाओं के प्रत्येक सेट के लिए एक नया पूल शुरू किए बिना)?

उत्तर

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

आउटपुट अब PIDs दोहराया नहीं है::

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 
अन्यथा, अपने iterable में एक से अधिक आइटम कार्यकर्ता प्रक्रियाओं की धारणा से एक "काम" में एक साथ बंडल हो
संबंधित मुद्दे