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

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

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

Ответы [ 2 ]

4 голосов
/ 19 ноября 2009

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

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()
0 голосов
/ 18 ноября 2009

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

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

Pyro/ext/daemonizer.py
...