2010-08-04 19 views
15

कर बिना pythonw.exe प्रक्रियाओं spawns मुझे समझ नहीं आता क्यों इस सरल कोडअजगर बहु ​​लगातार किसी भी वास्तविक कार्य

# file: mp.py 
from multiprocessing import Process 
import sys 

def func(x): 
    print 'works ', x + 2 
    sys.stdout.flush() 

p = Process(target= func, args= (2,)) 
p.start() 
p.join() 
p.terminate() 
print 'done' 
sys.stdout.flush() 

लगातार बनाता है "pythonw.exe" प्रक्रियाओं और यह कुछ भी प्रिंट नहीं करता है, भले ही

python mp.py 

मैं दोनों 32 और 64 बिट

+0

क्या है उत्पादन में यह चल रहा है, जबकि? –

+0

सभी आउटपुट – lj8888

उत्तर

32

आप protect then entry point of the program by using if __name__ == '__main__': करने की आवश्यकता है उपयोग करने की आवश्यकता के अनुसार।

यह एक विंडोज विशिष्ट समस्या है। विंडोज़ पर आपके मॉड्यूल को अपने लक्ष्य कोड तक पहुंचने के लिए एक नए पायथन दुभाषिया में आयात किया जाना है। यदि आप स्टार्टअप कोड चलाने वाले इस नए दुभाषिया को नहीं रोकते हैं तो यह एक और बच्चा पैदा करेगा, जो तब तक एक और बच्चा पैदा करेगा, जब तक कि यह pythonw.exe प्रक्रियाओं तक नज़र देख सके।

अन्य प्लेटफ़ॉर्म उपप्रोसेसेस लॉन्च करने के लिए os.fork() का उपयोग करते हैं, इसलिए मॉड्यूल को पुनः आयात करने की समस्या नहीं है।

तो अपने कोड इस तरह देखने के लिए की आवश्यकता होगी:

from multiprocessing import Process 
import sys 

def func(x): 
    print 'works ', x + 2 
    sys.stdout.flush() 

if __name__ == '__main__': 
    p = Process(target= func, args= (2,)) 
    p.start() 
    p.join() 
    p.terminate() 
    print 'done' 
    sys.stdout.flush() 
+1

इतना आसान विस्तार, याद करने में इतना आसान है, धन्यवाद – lj8888

+1

यह थ्रेडैड एक जीवन बचतकर्ता रहा है, मेरी सरल पायथन लिपि pythonw.exe के "zillions" को उत्पन्न कर रही थी और विंडोज को ओवरलोड और गिरने का कारण बन रही थी। धन्यवाद! – Hornbydd

1

अजीब बात है, मेरी Linux मशीन पर काम करता है विंडोज 7 पर पायथन 2.6 के नवीनतम चला रहा हूँ: मैं इसे कमांड लाइन से चलाने

$ python mp.py 
works 4 
done 
$ 

क्या मल्टीप्रोसेसिंग चीज विंडोज पर काम करना चाहती है? यूनिक्स दुनिया में पैदा हुए बहुत से कार्यक्रम विंडोज़ को बहुत अच्छी तरह से संभाल नहीं पाते हैं, क्योंकि यूनिक्स fork(2) का उपयोग क्लोन प्रक्रियाओं को काफी सस्ते में करने के लिए करता है, लेकिन (यह मेरी समझ है) कि विंडोज fork(2) का समर्थन नहीं करता है, अगर बिल्कुल भी।

+5

पर कोई आउटपुट फोर्क का समर्थन नहीं करता है इसलिए इसे एक नया पायथन दुभाषिया लॉन्च करना है और मॉड्यूल को फिर से आयात करना है, यानी आपकी स्क्रिप्ट। यदि आपने अपने स्टार्टअप कोड को 'if __name__ ==' __main __ 'के साथ सुरक्षित नहीं किया है: तो यह उस बच्चे की प्रक्रिया द्वारा चलाया जाता है जो अच्छा नहीं है। –

+2

... जो बच्चे की बाल प्रक्रिया द्वारा चलाया जाता है, जो कि बच्चे के बच्चे की प्रक्रिया द्वारा चलाया जाता है, जो ... – PaulMcG

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