2009-11-18 5 views
8

Я хотел бы создать процесс с использованием модуля mutliprocessing в python, но обеспечить его продолжение после процесса, который создал выходы подпроцесса.Отсоединить подпроцесс, запущенный с использованием модуля многопроцессорности python

Я могу получить требуемую функциональность, используя модуль подпроцесса и Popen, но я хочу запустить свой код как функцию, а не как скрипт. Причина, по которой я хочу это сделать, - упростить создание объектов pyro (python remote objects). Я хочу запустить обработчик запроса на объект pyro в отдельном процессе с использованием многопроцессорной обработки, но затем я хочу, чтобы основной процесс завершился, пока процесс, поддерживающий пиротехнический объект, продолжает работать.

ответ

0

Что вы пытаетесь сделать, это запустить процесс демона. Посмотрите на PEP-3143 и python-daemon.

взглянул в Пиро, и кажется, что они включают в свой собственный модуль daemonzing,

Pyro/ext/daemonizer.py 
+0

Благодарим за ответ. Я встретил это решение совсем недавно, согласен. Тем не менее, python-daemon, похоже, нацелен на более стандартную парадигму, где у программы есть одна функция, которая запускается как демон и никогда не возвращается. Я хотел бы сделать что-то вдоль линий: с daemon.DaemonContext(): some_daemon_loop() continue_with_this_function_after_daemon_has_launched() Я признателен за любые предложения. – glenn

+0

Я раньше не смотрел на пиро. С беглым взглядом на их код класс «демона» - это нечто вроде поточного диспетчера, а не отдельный процесс; нет, где в коде это когда-либо вилка. Pyro имеет модуль, входящий в состав функциональных возможностей daemon real daemon. – 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

Слово демона здесь злоупотребляется;) * Не * установите Process.daemon в True. Это говорит о многопроцессорности, чтобы попытаться убить ребенка при выходе (запутанный ха?). Я думаю, именно поэтому вам нужно поймать SIGTERM и установить detach_process в приведенном выше коде. - http://docs.python.org/library/multiprocessing.html#multiprocessing.Process.daemon – JimB