问题
On a Raspberry Pi I'm running two processes which loop constantly until an input is triggered which stops one of the processes but how do I stop both processes? The only thing that works is pressing control+c in the console I can't get it to stop with code at this moment.
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)
The above code simply looks for a button press, once the button is pressed it triggers to stopBlink function which flashes a red LED 20times.
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)
The above code simply flashes a blue LED on and off in a loop.
if __name__ == '__main__':
try:
P1 = Process(target = stopButton)
P2 = Process(target = testRunning)
P1.start()
P2.start()
P1.join()
P2.join()
Now when I hit the stopBlink function I want it to stop all other running processes but I just can't seem to get it to stop the testRunning function. I've tried adding
sys.exit(1)
To the stopBlink function but it has no affect on the other functions running.
回答1:
You could use multiprocessing.Event
for interprocess synchronization.
Here is a similar example:
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()
I don't know if the Raspberry Pi has special requirements, but this is how you deal with python threads and processes in a more generic way.
来源:https://stackoverflow.com/questions/27185107/how-to-stop-one-process-from-another-in-python