import multiprocessing
from threading import Thread
import speech_recognition as sr
def actions_func(conn1_3,conn2_3):
def capture_cam(conn1, conn1b):
def audio_listening(conn2, conn2b):
global catch_current_frame
catch_current_frame = False
# start dameon thread to handle frame requests:
Thread(target=handle_catch_current_frame_requests, args=(conn2,), daemon=True).start()
Thread(target=handle_cam_activate_requests, args=(conn2b,), daemon=True).start()
while True:
r = sr.Recognizer()
with sr.Microphone() as source:
catch_current_frame = False
r.adjust_for_ambient_noise(source)
print("Please say something...")
audio = r.listen(source)
try:
text = r.recognize_google(audio, language="es-ES")
print("You have said: \n " repr(text))
#Verifications
if text.lower() == "capture":
catch_current_frame = True
elif text.lower() == "Close your program":
#This is where I need to close processes p1, p2 and p3
break
else:
pass
except Exception as e:
print("Error : " str(e))
def main_process(finish_state):
conn1, conn1_3 = multiprocessing.Pipe(duplex=True)
conn2, conn2_3 = multiprocessing.Pipe(duplex=True)
conn1b, conn2b = multiprocessing.Pipe(duplex=True)
#Process 1
p1 = multiprocessing.Process(target=capture_cam, args=(conn1, conn1b, ))
p1.start()
#Process 2
p2 = multiprocessing.Process(target=audio_listening, args=(conn2, conn2b, ))
p2.start()
#Process 3
p3 = multiprocessing.Process(target=actions_func, args=(conn1_3 ,conn2_3 ,))
p3.start()
if __name__ == '__main__':
finish_state = multiprocessing.Event()
main_process(finish_state)
print("continue the code... ")
我需要當變數text等于"Close your program"3 個活動行程(、、、p1)p2時p3關閉。
我試圖做這樣的事情:
elif text.lower() == "Close your program":
print("the process has been interrupted!")
finish_state.set()
for process in [p1, p2, p3]:
process.terminate()
但這對我不起作用,我需要一個更好的代碼,如果text等于"Close your program".
我應該怎么做才能在這種情況下所有行程都被一一關閉?
uj5u.com熱心網友回復:
您可以嘗試以下基于事件的解決方案(但還有更簡單的解決方案可供遵循):
傳遞main_process給audio_listening一個額外的論點,finish_state:
def main_process():
conn1, conn1_3 = multiprocessing.Pipe(duplex=True)
conn2, conn2_3 = multiprocessing.Pipe(duplex=True)
conn1b, conn2b = multiprocessing.Pipe(duplex=True)
#Process 1
p1 = multiprocessing.Process(target=capture_cam, args=(conn1, conn1b, ))
p1.start()
#Process 2
finish_state = multiprocessing.Event()
p2 = multiprocessing.Process(target=audio_listening, args=(conn2, conn2b, finish_state))
p2.start()
#Process 3
p3 = multiprocessing.Process(target=actions_func, args=(conn1_3 ,conn2_3 ,))
p3.start()
finish_state.wait()
p1.terminate()
p2.terminate() # Not really necessary since the process is ending by itself
p3.terminate()
if __name__ == '__main__':
main_process()
請注意,現在main_process正在創建finish_state multiprocessing.Event實體;似乎沒有必要將其作為引數傳遞。設定事件后,主行程將終止它創建的子行程。
然后在audio_processing:
def audio_listening(conn2, conn2b, finish_state):
...
if text.lower() == "capture":
catch_current_frame = True
elif text.lower() == "Close your program":
# Set the finish state event:
finish_state.set()
break
甚至有兩個更簡單的替代方案甚至不需要Event變數:
該audio_process行程處于無限回圈中,直到它收到“關閉您的程式”訊息或收到例外。在這兩種情況下,它都會終止,然后我們可能希望其他兩個行程也終止。因此,主行程可以在啟動所有其他行程之后發出呼叫,p2.join()以等待audio_process行程完成,然后:
- 呼叫
p1.terminate()后跟p3.terminate()。 - 或啟動行程
p1并p3指定daemon=True,例如p1 = multiprocessing.Process(target=capture_cam, args=(conn1, conn1b), daemon=True). 作為守護行程,它們現在將在主行程終止時自動終止。因此,無需呼叫terminate這些行程。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425392.html
標籤:Python python-3.x 验证 过程 多处理
