Я пытаюсь запустить, приостановить и завершить дочерние процессы в Python из родительского процесса. Я пытался использовать multiprocessing.Value
, но по какой-то причине родительский процесс никогда не завершается полностью, хотя я terminate
и join
все процессы. Мой вариант использования выглядит примерно так:
def child(flow_flag):
while True:
with flow_flag.get_lock():
flag_value = flow_flag.value
if flag_value == 0:
print("This is doing some work")
elif flag_value == 1:
print("This is waiting for some time to check back later")
time.sleep(5)
else:
print("Time to exit")
break
def main():
flow_flag = Value('i', 0)
processes = [Process(target=child, args=(flow_flag,)) for i in range(10)]
[p.start() for p in processes]
print("Waiting for some work")
with flow_flag.get_lock():
flow_flag.value = 1
print("Do something else")
with flow_flag.get_lock():
flow_flag.value = 0
print("Waiting for more work")
with flow_flag.get_lock():
flow_flag.value = 2
print("Exiting")
for p in processes:
p.terminate()
p.join()
Это никогда не заканчивается должным образом, и мне в конечном итоге приходится Ctrl+C
. Тогда я вижу это сообщение:
Traceback (most recent call last):
File "/home/abcde/anaconda3/lib/python3.7/threading.py", line 1308, in _shutdown
lock.acquire()
KeyboardInterrupt
Что лучше? К вашему сведению, ожидая чего-то другого, я порождаю некоторые другие процессы. У меня также было, чтобы они не заканчивались должным образом, и я использовал с ними Value
. Это было исправлено, когда я переключился на использование Queue
для них. Тем не менее, Queue
не подходит для описанного выше случая.
PS: я sh в Ubuntu 18.04.
РЕДАКТИРОВАТЬ: после большой отладки, не выход из программы произошел из-за библиотеки, которую я использую, которую я не подозревал, чтобы вызвать это. Мои извинения за ложную тревогу. Спасибо за предложения о том, как лучше контролировать дочерние процессы.