मुझे पता है तुम उल्लेख किया है कि Pool.map दृष्टिकोण आप के लिए बहुत कुछ मतलब नहीं है। नक्शा इसे काम का स्रोत देने का एक आसान तरीका है, और प्रत्येक आइटम पर लागू करने के लिए एक कॉल करने योग्य है। मानचित्र के लिए func
दिए गए तर्क पर वास्तविक कार्य करने के लिए कोई प्रविष्टि बिंदु हो सकता है।
है कि आप के लिए सही नहीं लगता है, मैं एक निर्माता-उपभोक्त पद्धति का उपयोग कर के बारे में यहाँ पर एक बहुत विस्तृत जवाब है: https://stackoverflow.com/a/11196615/496445
अनिवार्य रूप से, आप एक पंक्ति बनाने के लिए, और एन श्रमिकों की संख्या शुरू करते हैं। फिर आप या तो मुख्य धागे से कतार फ़ीड करते हैं, या एक निर्माता प्रक्रिया बनाते हैं जो कतार को खिलाती है। मजदूर सिर्फ कतार से काम करते रहते हैं और आपके द्वारा शुरू की गई प्रक्रियाओं की संख्या से कहीं अधिक समवर्ती काम नहीं होगा।
आपके पास कतार पर सीमा डालने का विकल्प भी है, ताकि जब निर्माता पहले से ही बहुत अधिक उत्कृष्ट काम कर रहा हो, तो निर्माता को अवरुद्ध कर दिया जाए, अगर आपको उत्पादक उपभोग की गति और संसाधनों पर भी बाधा डालना पड़ता है।
जो कार्य फ़ंक्शन जिसे कॉल किया जाता है वह कुछ भी कर सकता है जो आप चाहते हैं। यह कुछ सिस्टम कमांड के चारों ओर एक रैपर हो सकता है, या यह आपके पायथन lib को आयात कर सकता है और मुख्य दिनचर्या चला सकता है। वहाँ विशिष्ट प्रक्रिया प्रबंधन प्रणाली हैं जो आपको सीमित संसाधनों के तहत अपने मनमानी निष्पादन योग्य चलाने के लिए कॉन्फ़िगरेशन सेट अप करने देती हैं, लेकिन यह करने के लिए यह केवल एक मूल पायथन दृष्टिकोण है।
बेसिक पूल: मेरा कि other answer से
स्निपेट्स
from multiprocessing import Pool
def do_work(val):
# could instantiate some other library class,
# call out to the file system,
# or do something simple right here.
return "FOO: %s" % val
pool = Pool(4)
work = get_work_args()
results = pool.map(do_work, work)
एक प्रक्रिया प्रबंधक और निर्माता का उपयोग करना
from multiprocessing import Process, Manager
import time
import itertools
def do_work(in_queue, out_list):
while True:
item = in_queue.get()
# exit signal
if item == None:
return
# fake work
time.sleep(.5)
result = item
out_list.append(result)
if __name__ == "__main__":
num_workers = 4
manager = Manager()
results = manager.list()
work = manager.Queue(num_workers)
# start for workers
pool = []
for i in xrange(num_workers):
p = Process(target=do_work, args=(work, results))
p.start()
pool.append(p)
# produce data
# this could also be started in a producer process
# instead of blocking
iters = itertools.chain(get_work_args(), (None,)*num_workers)
for item in iters:
work.put(item)
for p in pool:
p.join()
print results
क्या आपने [पायथन प्रक्रिया पूल] (http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool) की कोशिश की है? – C2H5OH
ऐसा करने का सबसे आसान तरीका एक "नियंत्रक" प्रोग्राम बनाना है जो 'multiprocessing.pool' बनाता है और कार्यकर्ता (program.py) थ्रेड को स्पैन करता है, उदाहरणों को समाप्त करने के रूप में कार्य को पुन: आवंटित करता है। – jozzas
धन्यवाद, मैं कोशिश करूँगा; किसी कारण से मेरे पहले प्रयास में मैं इस निष्कर्ष पर पहुंचा कि मल्टीप्रोसेसिंग.pool वह नहीं था जो मैं चाहता था, लेकिन अब यह सही लगता है। तो इस मामले में, वर्कर्स थ्रेड सिर्फ प्रोग्राम.py (एक थ्रेड के रूप में? Subprocess.Popen के साथ) spawn होगा? क्या आप कृपया एक मोटा उदाहरण या टेम्पलेट कार्यान्वयन पोस्ट कर सकते हैं जिसका मैं पालन कर सकता हूं? – steadfast