如何在Python中停止一个进程

时间:2014-11-28 09:03:52

标签: python python-2.7 raspberry-pi

在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函数但它对正在运行的其他函数没有影响。

1 个答案:

答案 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线程和进程的方法。