Я все еще ищу объяснение, почему возникает проблема, но я опубликую мой (хотя и несколько странный) обходной путь здесь на случай, если это поможет кому-то еще. Поскольку Ctrl + C распространяется на родительский процесс (все еще не совсем понятно, почему это происходит), я собираюсь просто перехватить исключение, когда оно прибывает, и ничего не делать.
Эрик предложил использовать дополнительный сторожевой поток для обработки завершения дополнительного процесса, но для моего приложения это создает дополнительную сложность и кажется немного излишним для того редкого случая, когда мне действительно нужно убить фоновый процесс. Большую часть времени фоновый процесс в моем приложении будет самопроизвольно закрываться, когда он будет завершен.
Я все еще открыт для предложений по лучшей реализации, которая не добавляет излишней сложности (больше процессов, потоков и т. Д.). .).
Модифицированный код здесь:
import multiprocessing
import time
import signal
import os
def backgroundProcess():
try:
while(True):
time.sleep(10)
except KeyboardInterrupt:
#Exit cleanly
return
def script():
print "Starting function"
#Kill all background processes
for proc in multiprocessing.active_children():
print "Killing " + str(proc) + " with PID " + str(proc.pid)
try:
#Apparently sending a CTRL-C to the child also sends it to the parent??
os.kill(proc.pid, signal.CTRL_C_EVENT)
#Sleep until the parent receives the KeyboardInterrupt, then ignore it
time.sleep(1)
except KeyboardInterrupt:
pass
print "Creating background process"
newProc = multiprocessing.Process(target=backgroundProcess)
print "Starting new background process"
newProc.start()
print "Process PID is " + str(newProc.pid)
def main():
script()
time.sleep(5)
script()