在Raspberry Pi上,我运行两个循环,这些进程不断循环,直到触发一个输入停止其中一个进程但是如何停止这两个进程?唯一有效的方法是在控制台中按下control + c,我现在无法用代码停止它。
def stopButton():
while 1:
wiringpi2.pinMode(52,0)
stopBut = wiringpi2.digitalRead(52)
print (stopBut)
wiringpi2.delay(500)
if (stopBut == 0):
stopBlink()
def stopBlink():
redBlink = int(0)
while (redBlink < int(20)):
wiringpi2.digitalWrite(pin2,HIGH)
wiringpi2.delay(50)
wiringpi2.digitalWrite(pin2,LOW)
wiringpi2.delay(50)
redBlink += int(1)
上面的代码只是按下按钮,按下按钮后触发stopBlink功能,闪烁红色LED 20次。
def testRunning():
while 1:
wiringpi2.digitalWrite(pin3,HIGH) # Write HIGH to pin 2(U14 pin 2)
wiringpi2.delay(1000)
wiringpi2.digitalWrite(pin3,LOW) # Write LOW to pin
wiringpi2.delay(1000)
上面的代码只是在一个循环中打开和关闭蓝色LED。
if __name__ == '__main__':
try:
P1 = Process(target = stopButton)
P2 = Process(target = testRunning)
P1.start()
P2.start()
P1.join()
P2.join()
现在,当我点击stopBlink函数时,我希望它停止所有其他正在运行的进程,但我似乎无法让它停止testRunning函数。我尝试过添加
sys.exit(1)
到stopBlink函数但它对正在运行的其他函数没有影响。
答案 0 :(得分:3)
您可以使用multiprocessing.Event
进行进程间同步。
以下是一个类似的例子:
from multiprocessing import Process, Event, Lock
from time import sleep
def wait(stop_event, lock):
with lock:
print "Waiting 2 s..."
sleep(2)
with lock:
print "Stopping processes..."
stop_event.set()
def loop(stop_event, lock):
while not stop_event.is_set():
with lock:
print "Looping every 0.5 s..."
sleep(0.5)
if __name__ == '__main__':
stop_event, lock = Event(), Lock()
wait_process = Process(target=wait, args=(stop_event, lock))
loop_process = Process(target=loop, args=(stop_event, lock))
wait_process.start(), loop_process.start()
wait_process.join(), loop_process.join()
我不知道Raspberry Pi是否有特殊要求,但这是你以更通用的方式处理python线程和进程的方法。