Python——为使用多处理运行的函数创建一个简单的killswitch



因此,我声称我基本上了解异步、多处理器、线程等的工作原理。我也知道如何听击键——这个网站上有很多很好的例子。

然而,我无法将两者合二为一。我有一个程序在循环中连续运行,直到它在某些情况下停止。在这些情况下,它使用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之后,它等待它完成。所以在处理过程中没有机会中断它。

您需要:

  1. 等待p1完成
  2. 等待时,查看主进程是否得到"q">
  3. 如果主进程得到一个"q",请停止它

类似于:

p1.start()
while p1.is_alive():
k = keyboard.read_key()
if k == 'q':
p1.terminate()

最新更新