Отключить подпроцесс, запущенный с использованием многопроцессорного модуля 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