2016-03-24 14 views
5

उत्तर नीचे दिए गए लिंक पर मेरे सामने सही हो सकता है लेकिन मुझे अभी भी समझ में नहीं आता है। मुझे यकीन है कि किसी ने मुझे यह समझाए जाने के बाद, डार्विन मुझसे फोन करेंगे।डेमॉन प्रोग्राम क्यों शामिल नहीं होता है()

उदाहरण at this link here है, हालांकि मैंने प्रयोग करने और मेरी समझ में मदद करने के लिए कुछ बदलाव किए हैं।

कोड यह रहा:

import multiprocessing 
import time 
import sys 

def daemon(): 
    p = multiprocessing.current_process() 
    print 'Starting: ', p.name, p.pid 
    sys.stdout.flush() 
    time.sleep(2) 
    print 'Exiting: ', p.name, p.pid 
    sys.stdout.flush() 

def non_daemon(): 
    p = multiprocessing.current_process() 
    print 'Starting: ', p.name, p.pid 
    sys.stdout.flush() 
    time.sleep(6) 
    print 'Exiting: ', p.name, p.pid 
    sys.stdout.flush() 

if __name__ == '__main__': 
    d = multiprocessing.Process(name='daemon', target=daemon) 
    d.daemon = True 

    n = multiprocessing.Process(name='non-daemon', target=non_daemon) 
    n.daemon = False 

    d.start() 
    time.sleep(1) 
    n.start() 
# d.join() 

और कोड के उत्पादन में है:

Starting: daemon 6173 
Starting: non-daemon 6174 
Exiting: non-daemon 6174 

हैं में शामिल होने के() पर अंत uncommented है, तो उत्पादन होता है:

Starting: daemon 6247 
Starting: non-daemon 6248 
Exiting: daemon 6247 
Exiting: non-daemon 6248 

मैं भ्रमित हूं बी/सी डिमन की नींद 2 सेकंड है, जबकि गैर-डिमन 6 सेकंड है। यह पहले मामले में "बाहर निकलने" संदेश क्यों मुद्रित नहीं करता है? डिमन को गैर-डिमन से पहले जागृत होना चाहिए और संदेश मुद्रित करना चाहिए था।

साइट से स्पष्टीकरण इस तरह के रूप में है:

उत्पादन डेमॉन प्रक्रिया से "बाहर निकल रहा है" संदेश, शामिल नहीं है के बाद से गैर डेमॉन प्रक्रियाओं के सभी (मुख्य कार्यक्रम सहित) डेमॉन प्रक्रिया से पहले बाहर निकलें इसके 2 सेकंड नींद से उठता है।

लेकिन मैंने इसे बदल दिया कि डिमन को गैर-डिमन के पहले जागृत होना चाहिए था। मुझे यहां क्या समझ नहीं आ रहा है? आपकी सहायता के लिये पहले से ही धन्यवाद।

संपादित करें: मैं अजगर 2.7 का उपयोग कर रहा उल्लेख करने के लिए भूल लेकिन जाहिरा तौर पर इस समस्या को अजगर 3.x

उत्तर

4

यह एक मजेदार एक नीचे ट्रैक करने के लिए था में भी है। दस्तावेज़ कुछ हद तक भ्रामक हैं, जिसमें वे गैर-डिमन प्रक्रियाओं का वर्णन करते हैं जैसे कि वे सभी समकक्ष हैं; किसी भी गैर-डिमन प्रक्रिया का अस्तित्व का मतलब है कि प्रक्रिया "परिवार" जीवित है। But that's not how it's implemented. अभिभावक प्रक्रिया दूसरों की तुलना में "अधिक बराबर" है;

for p in active_children(): 
    if p.daemon: 
     info('calling terminate() for daemon %s', p.name) 
     p._popen.terminate() 

for p in active_children(): 
    info('calling join() for process %s', p.name) 
    p.join() 

तो जब मुख्य प्रक्रिया पूर्ण होने पर, यह पहलेterminate सब daemon बच्चे प्रक्रियाओं, तोjoin सब बच्चे प्रक्रियाओं गैर daemon बच्चों पर प्रतीक्षा करने के लिए: multiprocessing एक atexit हैंडलर है जो निम्न करता पंजीकृत करता है और daemon बच्चों से संसाधनों को साफ करें।

यह इस क्रम में सफाई करता है, अपने गैर daemonProcessstart रों के बाद एक पल के कारण, मुख्य प्रक्रिया सफाई और जबरन terminate रों daemonProcess शुरू होता है।

ध्यान दें कि यह तय करने के रूप में सरल join मैन्युअल ing के रूप में गैर daemon प्रक्रिया, बस join ing daemon प्रक्रिया (जो एक daemon पूरी तरह से के पूरे मुद्दे धरा) नहीं हो सकता है; कि बुलाया जा रहा है, सफाई है कि daemon बच्चे terminate होगा देरी से atexit हैंडलर से बचाता है।

यह यकीनन एक बग है (एक है कि 3.5.1 के माध्यम से ऊपर मौजूद लगता है, मैं अपने आप को reproed), लेकिन क्या यह एक व्यवहार बग या एक डॉक्स बग है विवादास्पद है।

+2

मैं यह एक बग का गठन के बाद से व्यवहार 'threading' से अलग है, जहां डेमॉन धागे चालू रखने (जो' multiprocessing' धागे के बजाय प्रक्रियाओं का उपयोग कर अनुकरण करने के लिए माना जाता है), जबकि _any_ गैर डेमॉन धागा जिंदा रहता है तय कर लिया है (मुख्य या अन्यथा)। खोला [बग # 26,633] (https://bugs.python.org/issue26633)। इस समस्या की जांच में ऊपर और परे जा रहा है के लिए – ShadowRanger

+0

THX। सुनने के लिए मैं पागल नहीं हूँ और खुशी है कि डार्विन मेरे लिए बुला नहीं किया जाएगा, कम से कम इस समय =) – Classified

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