क्या इसके समतुल्य करने के लिए मल्टीप्रोसेसिंग का उपयोग करने का कोई आसान तरीका है?पायथन मल्टीप्रोसेसिंग - ऑब्जेक्ट्स की सूची में कक्षा विधि लागू करें
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()
आप लूप में अपनी प्रक्रियाओं में शामिल नहीं होना चाहते हैं, या आप उन्हें समानांतर के बजाय दूसरे के बाद एक चलाएंगे। अपने प्रश्न का उत्तर देने के लिए, प्रक्रिया शुरू करते समय आप एक multiprocessing.Queue ऑब्जेक्ट भेज सकते हैं और फिर पूर्ण होने पर स्वयं को कतार में डाल सकते हैं। –
शामिल होने के बारे में टिप्पणी के लिए ठीक है()। कतार के उपयोग के संबंध में, मुझे यकीन नहीं है कि यह कैसे काम करना चाहिए। क्या मेरे सिम ऑब्जेक्ट को गहराई से गुज़रने वाला नहीं है? – calys
@calys विंडोज़ पर आपको 'पिकलिंग एरर' मिलेगा क्योंकि आप एक विधि को चुनने की कोशिश कर रहे हैं, यूनिक्स पर कोई "गहरी कॉपी" नहीं है, बस प्रत्येक प्रक्रिया पूरी पता स्थान की एक पूर्ण प्रति प्राप्त करती है। उदाहरण के लिए आपको कुछ स्पष्ट इंटरप्रोसेस संचार द्वारा राज्य के परिवर्तन को प्रतिस्थापित करना होगा। – Bakuriu