2009-12-17 31 views
14

के कई उदाहरण लॉन्च कर रहा है मैं कुछ मल्टीप्रोसेसिंग कोड (पायथन 2.6.4, विनएक्सपी) लिख रहा हूं जो पृष्ठभूमि कार्यों को चलाने के लिए प्रक्रियाओं को उत्पन्न करता है। कुछ मामूली उदाहरणों के साथ खेलने में, मैं एक ऐसे मुद्दे पर चल रहा हूं जहां मेरा कोड लगातार नई प्रक्रियाओं को जन्म देता है, भले ही मैं केवल एक निश्चित संख्या को जन्म देने के लिए कहूं।मल्टीप्रोसेसिंग पाइथन वीएम

प्रोग्राम स्वयं ठीक चलता है, लेकिन यदि मैं विंडोज टास्कमेनर में देखता हूं, तो मैं नई 'python.exe' प्रक्रियाओं को प्रकट करता रहता हूं। कार्यक्रम चलने के बाद वे अधिक से अधिक चमकते रहते हैं (अंततः मेरी मशीन को भूखा)।


उदाहरण के लिए,
मैं नीचे दिए गए कोड 2 python.exe प्रक्रियाओं शुरू करने की उम्मीद रखते हैं। पहला कार्यक्रम स्वयं ही है, और दूसरा बच्चा प्रक्रिया होने के कारण यह पैदा होता है। कोई आइडिया है कि मैं क्या गलत कर रहा हूँ?

import time 
import multiprocessing 


class Agent(multiprocessing.Process): 
    def __init__(self, i): 
     multiprocessing.Process.__init__(self) 
     self.i = i 

    def run(self): 
     while True: 
      print 'hello from %i' % self.i 
      time.sleep(1) 


agent = Agent(1) 
agent.start() 

उत्तर

20

ऐसा लगता है कि आपने दस्तावेज़ों में विशेष रूप से this section पर दिशानिर्देशों का सावधानीपूर्वक पालन नहीं किया है, जहां यह "मुख्य मॉड्यूल का सुरक्षित आयात" के बारे में बात करता है।

आपको अपने लॉन्च कोड को if __name__ == '__main__': ब्लॉक से सुरक्षित रखने की आवश्यकता है या आपको वह मिल जाएगा जो आपको मिल रहा है, मुझे विश्वास है।

मुझे विश्वास है कि यह मल्टीप्रोसेसिंग मॉड्यूल पर आता है जो os.fork() का उपयोग करने में सक्षम नहीं है क्योंकि यह लिनक्स पर करता है, जहां पहले से चलने वाली प्रक्रिया मूल रूप से स्मृति में क्लोन की जाती है। विंडोज़ पर (जिसमें कोई फर्क नहीं है)) इसे एक नया पायथन दुभाषिया चलाने चाहिए और इसे अपने मुख्य मॉड्यूल को आयात करने के लिए कहें और उसके बाद शुरू होने के बाद स्टार्ट/रन विधि निष्पादित करें। यदि आपके पास "मॉड्यूल स्तर" पर कोड है, तो नाम चेक से असुरक्षित, फिर आयात के दौरान यह पूरे अनुक्रम को फिर से शुरू करता है, विज्ञापन infinitum

+0

यह था !! वाह .. वास्तव में अजीब व्यवहार। –

+1

कार्यान्वयन को समझने के बाद यह अजीब नहीं है, जो पीटर ने इंगित किया है। – jnoller

+0

@jnoller, यह तब तक स्पष्ट नहीं है जब तक कि आप ध्यान से न देख सकें, लेकिन स्पष्टीकरण जोड़ने के लिए मैंने अपना जवाब संपादित करने से पहले कोरी ने अपनी टिप्पणी की। –

0

जब मैं python2.6 साथ लिनक्स में इस चलाने के लिए, मैं 4 python2.6 प्रक्रियाओं की एक अधिकतम देख सकते हैं और मैं गारंटी नहीं दे सकते कि वे इस प्रक्रिया से सभी कर रहे हैं। वे निश्चित रूप से मशीन भर नहीं रहे हैं।

नए पायथन संस्करण की आवश्यकता है? लिनक्स/विंडोज अंतर?

+0

यदि आप सामान्य रूप से लिनक्स पर प्रक्रियाओं के बीच संबंध देखना चाहते हैं तो आप " पीएस axjf "प्रक्रियाओं के कुछ प्रकार के" पेड़ "दृश्य पाने के लिए। –

+0

मैं नवीनतम पायथन 2.x (2.6.4) –

0

मुझे इसके साथ कुछ भी गलत नहीं दिख रहा है। उबंटू 9 .10 (पायथन 2.6.4) पर ठीक काम करता है।

क्या आप वाकई क्रॉन या अपनी स्क्रिप्ट की कई प्रतियां शुरू नहीं कर रहे हैं? या यह कि स्पॉन्ड स्क्रिप्ट कुछ भी नहीं बुला रही है जो एक नया उदाहरण शुरू करेगी, उदाहरण के लिए यदि आपका कोड आयात पर सीधे चलता है तो आयात के साइड इफेक्ट के रूप में?

+0

पर हूं, मैं सकारात्मक हूं केवल एक संस्करण शुरू हो रहा है। यह पूरी तरह से विचित्र है। यह सिर्फ मेरी मशीन पर spawning और spawning रहता है। * निक्स पर सत्यापन के लिए धन्यवाद। –

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