2009-11-18 15 views
8

का उपयोग करके शुरू किया गया एक उपप्रोसेक्ट डिटेक्ट करें मैं पाइथन में mutliprocessing मॉड्यूल का उपयोग करके एक प्रक्रिया बनाना चाहता हूं लेकिन यह सुनिश्चित करता है कि यह उपप्रोसेस निकास की प्रक्रिया के बाद चल रहा है।पायथन मल्टीप्रोसेसिंग मॉड्यूल

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

उत्तर

0

जो आप करने की कोशिश कर रहे हैं वह एक डेमॉन प्रक्रिया शुरू करना है। PEP-3143 पर देखें, और python-daemon पैकेज।

Pyro में एक नज़र लिया, और ऐसा लगता है वे अपने स्वयं के daemonzing मॉड्यूल,

Pyro/ext/daemonizer.py 
+0

उत्तर के लिए धन्यवाद। हाल ही में उस समाधान में आने के बाद, मैं सहमत हूं। हालांकि, पायथन-डिमन को अधिक मानक प्रतिमान के लिए लक्षित किया जाता है जहां एक प्रोग्राम में एक फ़ंक्शन होता है जिसे डिमन के रूप में शुरू किया जाता है और कभी वापस नहीं आता है। daemon.DaemonContext() के साथ :: मैं की तर्ज पर कुछ करना चाहते हैं some_daemon_loop() continue_with_this_function_after_daemon_has_launched() मैं किसी भी सुझाव की सराहना करते हैं। – glenn

+0

मैंने वास्तव में पहले पाइरो को नहीं देखा था। उनके कोड पर एक सरसरी नज़र से, "डेमन" वर्ग थ्रेडेड प्रेषक की तरह कुछ है, और एक अलग प्रक्रिया नहीं है; कोड में कहीं भी यह कभी कांटा नहीं है। पाइरो में एक मॉड्यूल डिमन वास्तविक डेमॉन कार्यक्षमता के लिए शामिल है। – JimB

4

मैं अंत में मिला मैं चाहता था शामिल हैं। मैं कोड को बेहतर बनाने के लिए किसी भी सुझाव की सराहना करता हूं।

def start_server(): 
    pyrodaemon = Pyro.core.Daemon() 
    #setup daemon and nameserver 
    #Don't want to close the pyro socket 
    #Need to remove SIGTERM map so Processing doesn't kill the subprocess 
    #Need to explicitly detach for some reason I don't understand 
    with daemon.DaemonContext(files_preserve=[pyrodaemon.sock],signal_map={signal.SIGTERM:None},detach_process=True): 
     while running: 
      pyrodaemon.handleRequests(timeout=1.0) 
    #when finished, clean up 
    pyrodaemon.shutdown() 

def main(): 
    p = Process(target=start_server) 
    p.daemon=True # Need to inform Process that this should run as a daemon 
    p.start() 
    time.sleep(3.0) # Important when running this program stand alone: Must wait long enough for start_server to get into the daemon context before the main program exits or Process will take down the subprocess before it detaches 
    do_other_stuff_not_in_the_daemon() 
+1

डेमॉन शब्द का दुरुपयोग हो रहा है;) * प्रक्रिया को सही नहीं करें। यह बाहर निकलने पर बच्चे को मारने का प्रयास करने के लिए मल्टीप्रोसेसिंग को बताता है (हुह उलझन में?)। मुझे लगता है कि यही कारण है कि आपको SIGTERM को पकड़ने और उपरोक्त कोड में detach_process सेट करने की आवश्यकता है। - http://docs.python.org/library/multiprocessing.html#multiprocessing.Process.daemon – JimB