2009-11-18 21 views
8

Python'da mutlus işleme modülünü kullanarak bir işlem oluşturmak, ancak alt işlem çıkışlarını oluşturan işlemden sonra çalışmaya devam ettiğinden emin olmak istiyorum.Python çoklu işlem modülü kullanılarak başlatılan bir alt işlemin ayrılması

Ben altişlem modülü ve POPEN kullanarak gerekli işlevselliği alabilirsiniz, ama ben bir komut dosyası olarak, bir fonksiyon olarak kodumu çalıştırmak istiyorum. Bunu yapmak istediğim nedeni pyro (python uzak nesneleri) nesneleri oluşturmayı basitleştirmek. Pyro nesnesi istek işleyicisini çoklu işlem kullanarak ayrı bir işlemde başlatmak istiyorum, ancak daha sonra piro nesnesini destekleyen süreç çalışmaya devam ederken ana sürecin çıkmasını istiyorum. Eğer yapmaya çalıştığını ne

cevap

0

servis sürecini başlatmaktır. PEP-3143 ve python-daemon paketine bakın.

Pyro içine bir göz aldı ve onlar nihayet ben istediğini aldı

Pyro/ext/daemonizer.py 
+0

Cevabınız için teşekkür ederiz. Bu çözümü kendime son zamanlarda geldim, katılıyorum. Bir program, bir cini olarak başladı ve döndürür asla bir işlevi vardır nereye Ancak, piton-cin daha standart paradigma hedefleyen gibi görünüyor. daemon.DaemonContext() ile : Ben çizgisinde bir şey yapmak istiyorum some_daemon_loop() continue_with_this_function_after_daemon_has_launched() Ben önerilerinizi takdir . – glenn

+0

Gerçekten önce pyro baktı etmemişti. Onların koduna bir şeref bakışta, "daemon" sınıfı, bir dişli dağıtıcı gibi bir şeydir ve ayrı bir süreç değildir; hayır kodda hiçbir yerde çatal yok. Pyro'nun daemon gerçek daemon işlevselliği için bir modülü vardır. Daemon kelime burada istismar oluyor – JimB

4

kendi daemonzing modülünü içerir görünüyor. Kodu geliştirmek için herhangi bir öneriniz için teşekkür ederiz.

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

;) * etmeyin * True Process.daemon ayarlayın. Bu, çoklu işlemin çocuğa çıkışta öldürmeyi denemesini söyler (kafa karıştırıcı ha?). Bu yüzden SIGTERM'i yakalamanız ve yukarıdaki kodda detach_process komutunu ayarlamanız gerektiğini düşünüyorum. - http://docs.python.org/library/multiprocessing.html#multiprocessing.Process.daemon – JimB