2015-12-26 3 views
0

Эта проблема, похоже, ускользает от меня - все решения более похожи на обходные пути и добавляют к коду довольно сложную задачу. С тех пор, как были сделаны какие-либо сообщения об этом, существуют ли какие-либо решения simple для следующего: при обнаружении прерывания клавиатуры, чистое завершение всех дочерних процессов, завершение программы?Многопроцессорная клавиатура Обработка ввода

Код ниже фрагмент моей структуры multiproccess - Я хотел бы сохранить как Возможное, добавляя необходимую функциональность:

from multiprocessing import Pool 
import time 

def multiprocess_init(l): 
    global lock 
    lock = l 

def synchronous_print(i): 
    with lock: 
     print i 
     time.sleep(1) 

if __name__ == '__main__': 

    lock = Lock() 
    pool = Pool(processes=5, initializer=multiprocess_init, initargs=(lock,)) 

    for i in range(1,20): 
     pool.map_async(synchronous_print, [i]) 

    pool.close() #necessary to prevent zombies 
    pool.join() #wait for all processes to finish 

ответ

0

Короткий ответ перейти на Python 3. Python 2 имеет несколько проблем с синхронизацией нити/процесса, которые были исправлены в питоном 3.

в вашем случае, multiprocessing будет упорно воссоздают ваш ребенок обрабатывает каждый раз, когда вы посылаете прерывание клавиатуры и pool.close застрянут и никогда не выйти. Вы можете уменьшить проблему, явно выйдя из дочернего процесса с os.exit и ожидая отдельных результатов от apply_async, чтобы вы не застряли в тюрьме pool.close.

from multiprocessing import Pool, Lock 
import time 
import os 

def multiprocess_init(l): 
    global lock 
    lock = l 
    print("initialized child") 

def synchronous_print(i): 
    try: 
     with lock: 
      print i 
      time.sleep(1) 
    except KeyboardInterrupt: 
     print("exit child") 
     os.exit(2) 

if __name__ == '__main__': 

    lock = Lock() 
    pool = Pool(processes=5, initializer=multiprocess_init, initargs=(lock,)) 

    results = [] 
    for i in range(1,20): 
     results.append(pool.map_async(synchronous_print, [i])) 

    for result in results: 
     print('wait result') 
     result.wait() 

    pool.close() #necessary to prevent zombies 
    pool.join() #wait for all processes to finish 
    print("Join completes") 
Смежные вопросы