Почему мои мультипроцессы не запускаются без time.sleep в основном? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть некоторая фоновая задача, которую я хочу запустить, чтобы можно было безопасно завершить работу с помощью ввода пользователя.Для этого у меня есть поток, в котором запущен пул процессов с непрерывной задачей.Существует блокировка ввода для остановки печати и ожидания ввода пользователя, а также событие для остановки всего процесса.Что меня удивляет, так это то, что процессы, похоже, запускаются и выполняют свою работу, если после запуска потока с Processpool (6-я строка в основном) есть время. Sleep.

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 голосов
/ 13 сентября 2018

По моему мнению, вы запускаете свой скрипт из 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()
...