我有一些后台任务,我想启动一个能够通过用户输入安全退出的任务。 为此,我有一个线程在其中启动具有连续任务的进程池。有一个输入锁可以停止打印并等待用户输入,还有一个事件可以停止整个过程。 令我感到惊讶的是,如果有时间,进程似乎会启动并执行其工作。在进程池(主线程的第6行)启动之后,就进入睡眠状态。
import multiprocessing as mp
import time
import threading as tr
def init(e, l):
global stop_event
global input_lock
stop_event = e
input_lock = l
def stupid_task(n):
while not stop_event.is_set():
with input_lock:
print(n)
time.sleep(2)
def test_mng(n, event, lock):
with mp.Pool(n, initializer=init, initargs=(event, lock,)) as p:
print("before")
p.map(stupid_task, range(1, n + 1))
print("after")
p.close()
p.join()
def main():
i_lock = mp.Lock()
s_event = mp.Event()
thread = tr.Thread(target=test_mng, args=(3, s_event, i_lock))
init(s_event,i_lock)
thread.start()
time.sleep(1) # if this line is commented out only "before" is printed
while not stop_event.is_set():
input("")
with input_lock:
print("stopped")
eingabe = input("type q to quit")
if eingabe == "q":
stop_event.set()
if __name__ == "__main__":
main()
我问自己是什么导致进程池无法正常工作。我从根本上做错了吗? time.sleep似乎有点黑。
答案 0 :(得分:1)
我认为,您是从IDE(例如PyCharm)运行脚本,而不是从控制台运行脚本。您的IDE正在捕获键盘事件。
您可以简化处理过程:
这是一个可能的解决方案:
# coding: utf-8
import multiprocessing as mp
import threading as tr
import time
stop_event = None
def init(event):
global stop_event
stop_event = event
def stupid_task(n):
while not stop_event.is_set():
print(n)
time.sleep(2)
def test_mng(n, event):
with mp.Pool(n, initializer=init, initargs=(event,)) as p:
print("before")
p.map(stupid_task, range(1, n + 1))
print("after")
p.close()
p.join()
def main():
print("type 'q' <ENTER> to quit")
s_event = mp.Event()
init(s_event)
thread = tr.Thread(target=test_mng, args=(3, s_event,))
thread.start()
while not stop_event.is_set():
c = input("")
if c in "qQ":
stop_event.set()
if __name__ == "__main__":
main()