2010-12-04 10 views
5

मैं पाइथन मल्टीप्रोसेसिंग मॉड्यूल की खोज कर रहा हूं और समझ में नहीं आता कि निम्न कोड कुछ भी क्यों प्रिंट नहीं करता है। समय-लूप के बिना कार्यक्रम वर्कर_1 को अपेक्षित के रूप में प्रिंट करता है।पाइथन मल्टीप्रोसेसिंग: वर्कर फ़ंक्शन में जबकि-लूप के साथ कोई आउटपुट

import multiprocessing, time 

def worker1(): 
    print 'Worker_1' 
    while 1: 
     print 'Worker_1' 
     time.sleep(3) 
    return 

if __name__ == '__main__': 
    jobs = [] 
    p = multiprocessing.Process(target=worker1) 
    jobs.append(p) 
    p.start() 
+0

मैं मल्टीप्रोसेसिंग मॉड्यूल पर एक मास्टर नहीं हूं, और मैं अभी इसका परीक्षण नहीं कर सकता, लेकिन अपने 'p.start() 'के बाद' p.join()' जोड़ने का प्रयास करें। यदि सबप्रोसेस शुरू होने के बाद मुख्य कार्यक्रम निकलता है, तो उपप्रजाति जारी है? मुझे ऐसा नहीं लगता, लेकिन मुझे नहीं पता। ध्यान दें कि इसका मतलब है कि जब आप इसे चाहते हैं तो कार्यकर्ता को रोकने के लिए आपको कुछ शेंगेनियां करना होगा। वैकल्पिक रूप से, फोर्क मॉड्यूल को शायद देखें। –

उत्तर

2

अपने सिस्टम (अजगर 2.6 & लिनक्स पर 2.7) पर, इस उम्मीद के रूप में काम करता है। आप किस प्लेटफॉर्म का उपयोग कर रहे हैं? कुछ प्लेटफार्मों (विंडोज़) पर, fork को पूरी तरह से नई प्रक्रिया बनाकर और इसे स्थापित करके नकल किया जाना है। मुझे संदेह है कि stdout को बाल प्रक्रिया में स्थानांतरित नहीं किया गया है। आज़माएं:

  • threading मॉड्यूल। यह पर्याप्त है अगर आप थ्रेड में किसी ईवेंट की प्रतीक्षा करना चाहते हैं।
  • , इस तरह के बीएसडी, लिनक्स या सोलारिस
  • के रूप में एक फ़ाइल
+0

वर्तमान में मैं विंडोज़ पर एक्लिप्स और पायडेव के साथ काम कर रहा हूं। फ़ाइल में आउटपुट करना या तो काम नहीं करता है। मुझे बस एक खाली फाइल मिलती है। जो मुझे समझ में नहीं आता है वह समय-लूप का महत्व है। लूप के बिना आउटपुट है, लेकिन इसके साथ कोई आउटपुट नहीं है। – chessweb

+0

sys.stdout.flush() शायद जोड़ने का प्रयास करें? –

+0

मुझे विश्वास नहीं है कि 'प्रिंट ("कुछ") विंडोज पर एक बच्चे की प्रक्रिया में काम नहीं करता है। 'कांटा' कारण नहीं है। मैंने प्रश्न से पायथन 3.4 कोड को पोर्ट करने की कोशिश की है और यह अपेक्षित आउटपुट ['multiprocesssing.set_start_method ('spawn')'] (http://docs.python.org/3.4/library/multiprocessing.html के साथ उत्पन्न करता है # संदर्भ-और-प्रारंभ-विधियां) ('कांटा' स्वाभाविक रूप से भी काम करता है)। – jfs

0

आप निष्क्रिय उपयोग कर रहे हैं करने के लिए outputting एक POSIX संगत मंच पर अपने कार्यक्रम चला रहे हैं? मुझे लगता है कि यह समस्या है। आपके द्वारा लिनक्स में कोड जो कमांड लाइन से कॉल किया जाता है (यह हर 3 सेकंड में 'वर्कर_1' प्रिंट करता है)। जब मैं इसे आईडीईएल में आज़माता हूं, तो यह तुरंत बंद हो जाता है। ऐसा इसलिए है क्योंकि आपके पास p.join() नहीं है जिसके परिणामस्वरूप मुख्य प्रक्रिया तुरंत बंद हो जाती है जो तब कार्यकर्ता प्रक्रिया को रोक देती है। जाहिर है, p.join() लिनक्स में कमांड लाइन से आवश्यक नहीं है, हालांकि मैं इसे वैसे भी अनुशंसा करता हूं।

हालांकि, p.join() के साथ और आईडीएलई का उपयोग करके, स्क्रिप्ट बस वहां बैठती है और हमें कोई टेक्स्ट नहीं दिखाई देता है। यह है, मुझे लगता है कि, अजीब तरीके से आईडीईएल idlelib.rpc.RPCProxy के लिए stdout reroutes। तो, दूसरे शब्दों में, यदि आप आईडीएलई का उपयोग कर रहे हैं, तो यह आपकी समस्या है।

+0

मैं विंडोज पर PyDev के साथ Ecplise का उपयोग कर रहा हूँ। – chessweb

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