因此,我声称我基本上了解异步、多处理器、线程等的工作原理。我也知道如何听击键——这个网站上有很多很好的例子。
然而,我无法将两者合二为一。我有一个程序在循环中连续运行,直到它在某些情况下停止。在这些情况下,它使用Multiprocessing.Queue()
来提示用户输入是否应该继续。
所有这些工作,到目前为止都很好。现在我想在这里添加第二个catch案例:一旦程序开始运行,只要我按下某个按钮(比如Escape(,它就会立即停止工作。
这是我的程序的一个非常愚蠢的版本:
test.py:
from test3 import Counter
from multiprocessing import Process, Queue
import sys
def main(q, passed_variable):
foo = Counter()
p1 = Process(target=foo.counting, args=(q,passed_variable))
p1.start()
p1.join()
if q.get() == False:
x = input("Keep going?")
print(x)
if x == "y":
main(q, user_Input)
else:
sys.exit()
if __name__ == "__main__":
q = Queue()
user_Input = ("What you want from me, man?")
print("Starting")
main(q, passed_variable=user_Input)
test3.py:
import time
class Counter:
def counting(self, q, user_input):
x = 0
while True:
print(str(x) + " " + user_input)
if x == 4:
q.put(False)
break
time.sleep(1)
x += 1
我尝试了我能想到的一切,在任何情况下我都没有得到想要的结果,在这个特定的情况下,我在这里发现的任何问题都无法帮助我。
您可以使用keyboard
解决此问题,然后创建第二个Queue()
:
from test3 import Counter
from multiprocessing import Process, Queue
import sys
import keyboard
def main(q, queue2, passed_variable):
foo = Counter()
p1 = Process(target=foo.counting, args=(q,passed_variable))
p1.start()
p2 = Process(target=keyCatcher, args=(queue2,))
p2.start()
if queue2.get() == False:
p1.terminate()
print("Terminating Programm")
sys.exit()
if q.get() == False:
x = input("Keep going?")
print(x)
if x == "y":
main(q, queue2, user_Input)
else:
sys.exit()
def keyCatcher(queue2):
while True:
if keyboard.is_pressed('q'): # if key 'q' is pressed
queue2.put(False)
if __name__ == "__main__":
q = Queue()
queue2 = Queue()
user_Input = ("What you want from me, man?")
print("Starting")
main(q, queue2, passed_variable=user_Input)
关键在于:
p1.start()
p1.join()
这意味着在main()
启动p1之后,它等待它完成。所以在处理过程中没有机会中断它。
您需要:
- 等待p1完成
- 等待时,查看主进程是否得到"q">
- 如果主进程得到一个"q",请停止它
类似于:
p1.start()
while p1.is_alive():
k = keyboard.read_key()
if k == 'q':
p1.terminate()