2013-04-03 11 views
11

क्या इसके समतुल्य करने के लिए मल्टीप्रोसेसिंग का उपयोग करने का कोई आसान तरीका है?पायथन मल्टीप्रोसेसिंग - ऑब्जेक्ट्स की सूची में कक्षा विधि लागू करें

for sim in sim_list: 
    sim.run() 

जहां sim_list के तत्वों "अनुकरण" वस्तुओं और रन() कर रहे हैं सिमुलेशन वर्ग जो वस्तुओं की विशेषताओं को संशोधित करता है की एक विधि है। उदा .:

class simulation: 
    __init__(self): 
    self.state['done']=False 
    self.cmd="program" 
def run(self): 
    subprocess.call(self.cmd) 
    self.state['done']=True 

सिम_लिस्ट में सभी सिम स्वतंत्र हैं, इसलिए रणनीति को थ्रेड सुरक्षित नहीं होना चाहिए।

मैंने निम्नलिखित की कोशिश की, जो स्पष्ट रूप से त्रुटिपूर्ण है क्योंकि तर्क गहराई से गुजरता है और जगह में संशोधित नहीं किया जाता है।

from multiprocessing import Process 

for sim in sim_list: 
    b = Process(target=simulation.run, args=[sim]) 
    b.start() 
    b.join() 
+3

आप लूप में अपनी प्रक्रियाओं में शामिल नहीं होना चाहते हैं, या आप उन्हें समानांतर के बजाय दूसरे के बाद एक चलाएंगे। अपने प्रश्न का उत्तर देने के लिए, प्रक्रिया शुरू करते समय आप एक multiprocessing.Queue ऑब्जेक्ट भेज सकते हैं और फिर पूर्ण होने पर स्वयं को कतार में डाल सकते हैं। –

+0

शामिल होने के बारे में टिप्पणी के लिए ठीक है()। कतार के उपयोग के संबंध में, मुझे यकीन नहीं है कि यह कैसे काम करना चाहिए। क्या मेरे सिम ऑब्जेक्ट को गहराई से गुज़रने वाला नहीं है? – calys

+0

@calys विंडोज़ पर आपको 'पिकलिंग एरर' मिलेगा क्योंकि आप एक विधि को चुनने की कोशिश कर रहे हैं, यूनिक्स पर कोई "गहरी कॉपी" नहीं है, बस प्रत्येक प्रक्रिया पूरी पता स्थान की एक पूर्ण प्रति प्राप्त करती है। उदाहरण के लिए आपको कुछ स्पष्ट इंटरप्रोसेस संचार द्वारा राज्य के परिवर्तन को प्रतिस्थापित करना होगा। – Bakuriu

उत्तर

11

एक तरह से तुम क्या चाहते करने के लिए अपने कंप्यूटिंग वर्ग (आपके मामले में simulation) Process का एक उपवर्ग होना है। जब सही तरीके से प्रारंभ किया गया, तो इस वर्ग के उदाहरण अलग-अलग प्रक्रियाओं में चले जाएंगे और आप जैसे ही चाहें सूची में से एक समूह को सेट कर सकते हैं। तो बस वस्तुओं की एक सूची बनाने के लिए और शुरू एक पाश के साथ हर एक

import multiprocessing 
import os 
import random 

class simulation(multiprocessing.Process): 
    def __init__(self, name): 
     # must call this before anything else 
     multiprocessing.Process.__init__(self) 

     # then any other initialization 
     self.name = name 
     self.number = 0.0 
     sys.stdout.write('[%s] created: %f\n' % (self.name, self.number)) 

    def run(self): 
     sys.stdout.write('[%s] running ... process id: %s\n' 
         % (self.name, os.getpid())) 

     self.number = random.uniform(0.0, 10.0) 
     sys.stdout.write('[%s] completed: %f\n' % (self.name, self.number)) 

:

यहाँ है कि आप ऊपर लिखा था पर निर्माण एक उदाहरण है,

sim_list = [] 
sim_list.append(simulation('foo')) 
sim_list.append(simulation('bar')) 

for sim in sim_list: 
    sim.start() 

जब आप यह आपको चाहिए चलाने प्रत्येक ऑब्जेक्ट को अपनी प्रक्रिया में चलाएं देखें। Process.__init__(self) को किसी अन्य चीज़ से पहले, अपनी कक्षा प्रारंभ में पहली चीज़ के रूप में कॉल करना न भूलें।

स्पष्ट रूप से मैंने इस उदाहरण में किसी भी इंटरप्रोसेस संचार को शामिल नहीं किया है; आपको यह जोड़ना होगा कि अगर आपकी स्थिति की आवश्यकता है (यह आपके प्रश्न से स्पष्ट नहीं था कि आपको इसकी आवश्यकता है या नहीं)।

यह दृष्टिकोण मेरे लिए अच्छा काम करता है, और मुझे किसी भी कमी की जानकारी नहीं है। अगर कोई छुपा खतरों के बारे में जानता है जिसे मैंने अनदेखा किया है, तो कृपया मुझे बताएं।

मुझे उम्मीद है कि इससे मदद मिलती है।

+1

बहुत बहुत धन्यवाद। यह काम करता है :) – calys

+0

ग्रेट उत्तर, धन्यवाद –

संबंधित मुद्दे