2013-01-05 39 views
13

मैं अपने शुरुआती छात्रों के लिए पुस्तकालय के साथ खेल रहा हूं, और मैं पाइथन में मल्टीप्रोसेसिंग मॉड्यूल का उपयोग कर रहा हूं। मैं इस समस्या का सामना किया: importing and using a module that uses multiprocessing without causing infinite loop on Windowsविंडोज़ पर एक नई प्रक्रिया शुरू करते समय पाइथन के मल्टीप्रोसेसिंग मॉड्यूल __main__ क्यों आयात करते हैं?

उदाहरण के लिए, मान लीजिए कि मैं एक मॉड्यूल mylibrary.py है: यदि मैं पर main.py चलाने

# main.py 

import mylibrary 

mylibrary.foo() 

:

# mylibrary.py 

from multiprocessing import Process 

class MyProcess(Process): 
    def run(self): 
     print "Hello from the new process" 

def foo(): 
    p = MyProcess() 
    p.start() 

और एक मुख्य कार्यक्रम है कि इस पुस्तकालय कॉल विंडोज़, यह नई प्रक्रिया में main.py आयात करने का प्रयास करता है, जिसका अर्थ है कि कोड फिर से निष्पादित किया जाता है जिसके परिणामस्वरूप प्रक्रिया उत्पादन के अनंत लूप होते हैं। मैं यह इसलिए की तरह ठीक कर सकते हैं:

import mylibrary 

if __name__ == "__main__": 
    mylibrary.foo() 

लेकिन, इस शुरुआती के लिए बहुत भ्रामक है, और इसके अलावा ऐसा लगता है जैसे कि यह आवश्यक नहीं होना चाहिए। नई प्रक्रिया mylibrary में बनाई जा रही है, तो नई प्रक्रिया क्यों नहीं mylibrary आयात करती है? main.py को बदलने के बिना इस समस्या को हल करने का कोई तरीका है?

मैं पाइथन 2.7 का उपयोग कर रहा हूं।

उत्तर

23

विंडोज़ में fork नहीं है, इसलिए मौजूदा प्रक्रिया की तरह नई प्रक्रिया बनाने का कोई तरीका नहीं है। तो बच्चे की प्रक्रिया को फिर से अपना कोड चलाना पड़ता है, लेकिन अब आपको मूल प्रक्रिया और बाल प्रक्रिया के बीच अंतर करने का एक तरीका चाहिए, और __main__ है।

यह डॉक्स यहाँ में शामिल है: http://docs.python.org/2/library/multiprocessing.html#windows

मैं एक और तरीका कोड कांटा बम प्रभाव से बचने के लिए की संरचना करने के बारे में पता नहीं है।

+4

यह उत्तर स्वीकार किया जाना चाहिए। – Marcin

+1

मुझे यकीन है कि मुझे कुछ याद आ रहा है, लेकिन मेरा सवाल यह है कि बाल प्रक्रिया को फिर से सभी कोड चलाने होंगे। क्यों न सिर्फ मॉड्यूल ने नई प्रक्रिया शुरू की? – Laura

+0

@ लौरा: इसे अपने सभी कोड को फिर से चलाने के लिए है, क्योंकि यदि ऐसा नहीं होता है, तो इसका कोड नहीं होगा। बाल प्रक्रिया पूरी तरह से ताजा शुरू होती है, और यदि आप चाहते हैं कि यह आपके कार्य करे, तो इसे आपके कोड की आवश्यकता है। –