为什么主进程没有time.sleep不能启动我的多进程?

时间:2018-09-13 08:35:51

标签: python python-multiprocessing python-multithreading

我有一些后台任务,我想启动一个能够通过用户输入安全退出的任务。 为此,我有一个线程在其中启动具有连续任务的进程池。有一个输入锁可以停止打印并等待用户输入,还有一个事件可以停止整个过程。 令我感到惊讶的是,如果有时间,进程似乎会启动并执行其工作。在进程池(主线程的第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似乎有点黑。

1 个答案:

答案 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()