Отключить подпроцесс, запущенный с использованием многопроцессорного модуля Python

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

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

2 ответа

Я наконец-то получил то, что хотел. Я ценю любые предложения по улучшению кода.

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()

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

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

Pyro/ext/daemonizer.py
Другие вопросы по тегам