2009-11-11 17 views
7

विंडोज के तहत पायथन में: मैं कुछ कोड को एक अलग प्रक्रिया में चलाने के लिए चाहता हूं। और मैं नहीं चाहता कि माता-पिता इसके लिए इंतजार कर रहे हों। कोशिश की:एक प्रक्रिया चलाएं और इसके बिना प्रतीक्षा किए छोड़ दें

from multiprocessing import Process 
from time import sleep 

def count_sheeps(number): 
    """Count all them sheeps.""" 
    for sheep in range(number): 
     sleep(1) 

if __name__ == "__main__": 
    p = Process(target=count_sheeps, args=(5,)) 
    p.start() 
    print("Let's just forget about it and quit here and now.") 
    exit() 

जो बाल प्रक्रिया शुरू करता है और निष्पादन जारी रखता है। हालांकि, जब माता-पिता अंत तक पहुंच जाते हैं, तो यह अभी भी बच्चे से बाहर निकलने की प्रतीक्षा करता है।

क्या बच्चे चलने पर भी माता-पिता को छोड़ने का कोई तरीका है? निश्चित रूप से, मैं subprocess.Popen का उपयोग करके एक नया पायथन दुभाषिया चला सकता हूं और भेड़-गिनती को एक अलग लिपि के रूप में खिला सकता हूं।

फिर भी, पाइथन कोड की प्रक्रियाओं के साथ खेलने के लिए यह संपूर्ण मॉड्यूल है, इसलिए मैं ओएस पर हैकिंग के बजाय इसका लाभ लेना चाहता हूं। साथ ही, यह बहुत ही अच्छा होगा अगर एक ही कोड हर जगह काम करता है जहां पाइथन सिर्फ विंडोज़ पर नहीं करता है।

+0

यहां के आसपास मैं आमतौर पर विपरीत समस्या देखता हूं। – mob

उत्तर

4

उपयोग अन्य उपप्रक्रिया नियंत्रण विधियों के रूप में subprocess मॉड्यूल (। Os.system, os.spawn *, os.popen *, popen2 , आदेश।) पदावनत किया जा रहा है:

from subprocess import Popen 
Popen([ "foo.exe", "arg1", "arg2", "arg3") 

See the Python doco, विशेष रूप से P_NOWAIT उदाहरण।

आपको उपप्रोसेसर में एक नया पायथन दुभाषिया शुरू करना होगा, इसलिए "foo.exe" उपरोक्त "python.exe" होगा।

संपादित करें:

join_thread(): पृष्ठभूमि धागा शामिल हों

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

डिफ़ॉल्ट रूप से करता है, तो एक प्रक्रिया कतार के निर्माता नहीं है पर फिर से बाहर निकलने के लिए यह कतार के पृष्ठभूमि धागा में शामिल होने का प्रयास करेंगे। cancel_join_thread() पर join_thread() कुछ भी करने के लिए प्रक्रिया कॉल कर सकते हैं।

cancel_join_thread(): रोकें join_thread() को अवरुद्ध करने से। विशेष रूप से, यह पृष्ठभूमि थ्रेड को में स्वचालित रूप से शामिल होने से रोकता है जब प्रक्रिया निकलती है - join_thread() देखें।

ऐसा लगता है कि आपको इच्छित व्यवहार प्राप्त करने के लिए cancel_join_thread() पर कॉल करने में सक्षम होना चाहिए। मैंने इस विधि का कभी भी उपयोग नहीं किया है (और एक मिनट पहले तक इसके अस्तित्व से अनजान था!), इसलिए यह सुनिश्चित करना सुनिश्चित करें कि यह आपके लिए काम करता है या नहीं।

+0

कृपया 'आयात * न करें। –

+0

निश्चित रूप से - आयात हटा दिया गया * –

+0

cancel_join_thread() कुछ और के लिए प्रतीत होता है: ताकि प्रक्रिया का उपयोग तब भी हो सकता है जब यह कतार का उपयोग खाली न हो। हालांकि, जब तक कि कुछ कतार चुपचाप मेरे उदाहरण में बनाई गई और भरी न हो, मुझे नहीं लगता कि यह मेरी मदद करेगा। –

1

लिनक्स के तहत आप fork कर सकते हैं लेकिन यह विंडोज पर काम नहीं करेगा।मुझे लगता है कि सबसे आसान तरीका है एक नया अजगर प्रक्रिया चलाने के लिए, एक अलग फाइल में अपने count_sheeps और Popen('python count_sheeps.py')

+0

सहमत - एकमात्र कठिनाई विधि के तर्कों को मार्शल कर रही है। Count_sheeps (संख्या) के लिए पर्याप्त आसान है, जहां "संख्या" एक पूर्णांक है। जटिल तर्कों के लिए, multiprocessing.Process विधि एक चालाक दृष्टिकोण है! –

+0

हाँ, यह पिटी कांटा विंडोज पर नहीं है। ऐसा लगता है कि मुझे इस मार्ग पर जाना होगा। –

-2

आप हमेशा ही नया धागा शुरू कर सकते हैं डाल कर, और लागू इसे शुरू कर रहा है इससे पहले कि myNewThread.daemon (सच) कहते हैं() विधि करने के लिए है ।

जब मुख्य प्रक्रिया निकलती है तो वह थ्रेड चलना जारी रहेगा।

+0

धन्यवाद, लेकिन वास्तव में नहीं। जब मुख्य कार्यक्रम निकलता है तो डेमॉन धागे मारे जाते हैं। गैर-डेमोनिक धागे से भिन्नता यह है कि कार्यक्रम उन्हें अपने आप खत्म करने की प्रतीक्षा करने के बजाय उन्हें मार देता है। –

+0

AFAICT डेमॉन थ्रेड मूल प्रश्न में वास्तव में आवश्यक है। यह सच है हालांकि डिमन थ्रेड चलने नहीं रहे हैं, यह इस जवाब में गलत था। – ketorin

2

आप p.daemon = True के साथ प्रक्रिया को डिमन के रूप में घोषित कर सकते हैं। http://docs.python.org/2/library/threading.html#thread-objects कहता है: "इस ध्वज का महत्व यह है कि पूरे पायथन प्रोग्राम बाहर निकलता है जब केवल डेमॉन धागे छोड़े जाते हैं।"

from multiprocessing import Process 
from time import sleep 

def count_sheeps(number): 
    """Count all them sheeps.""" 
    for sheep in range(number): 
     sleep(1) 

if __name__ == "__main__": 
    p = Process(target=count_sheeps, args=(5,)) 
    p.daemon = True 
    p.start() 
    print("Let's just forget about it and quit here and now.") 
    exit() 
संबंधित मुद्दे