Для этой задачи я использовал простые обратные отсчеты для функции fun1
и для подпроцессов p1
и p2
.Затем я начал экспериментировать с функцией как технологическим решением.Код основной программы:
#!/usr/bin/python2.7 python2.7
# -*- coding: utf-8 -*-
#An example of how to terminate the execution of a function
#which calls a process using an external trigger.
import time
import subprocess
from multiprocessing import Process, Queue
def fun0():
# start process1
p1 = subprocess.Popen(["python", "eg_script1_countdown1.py"])
p1_PID = p1.pid
print "p1_PID:", p1_PID
try:
p1.wait()
except KeyboardInterrupt:
try:
p1.terminate()
except OSError:
pass
p1.wait()
# call function1
fun1()
# loop 3 times
for i in range(1, 3, 1):
# call fun2
print "call function 2, loop n.", i
fun2()
def fun1():
for i in range(5,0,-1):
print "fun1 > take five in", i
time.sleep(1)
def fun2():
# start process2
p2 = subprocess.Popen(["python", "eg_script2_countdown2.py"])
p2_PID = p2.pid
print "p2_PID:", p2_PID
try:
p2.wait()
except KeyboardInterrupt:
try:
p2.terminate()
except OSError:
pass
p2.wait()
if __name__ == '__main__':
pMain = Process(target=fun0)
pMain_PID = pMain.pid
print "pMain_PID:", pMain_PID
pMain.start()
time.sleep(20)
pMain.terminate()
Код первого вызываемого файла:
#!/usr/bin/python2.7 python2.7
# -*- coding: utf-8 -*-
#eg_script1_countdown.py
import time
for i in range(10,0,-1):
print "script1.py > have a beer in", i
time.sleep(1)
и второго файла:
#!/usr/bin/python2.7 python2.7
# -*- coding: utf-8 -*-
#eg_script2_countdown.py
import time
for i in range(10,0,-1):
print "script2.py > give love in", i
time.sleep(1)
Я изменяю строку time.sleep(20)
в __name__ == '__main__'
, чтобы увидеть, как внутреннее завершение pMain.terminate()
влияет на результат.Я обнаружил, что:
- при запуске во время работы подпроцесса
p1
, он не завершает его, - при запуске во время работы
fun1()
, онзавершить функцию, - при запуске во время работы подпроцесса
p2
, он не завершает процесс, а завершает fun2()
в следующем цикле.
Как завершитьподпроцессы p1
и p2
во время работы?