2009-05-19 3 views
7

Я пытаюсь запустить приложение простых нескольких процессов в Python. Основной поток генерирует от 1 до N процессов и ждет, пока они все не обработают. Процессы каждый запустить бесконечный цикл, так что они потенциально могут работать вечно без какого-либо прерывания пользователя, так что я положил в некоторый код для обработки KeyboardInterrupt:Python Multiprocessing atexit Ошибка «Ошибка atexit._run_exitfuncs»

#!/usr/bin/env python 
import sys 
import time 
from multiprocessing import Process 

def main(): 
    # Set up inputs.. 

    # Spawn processes 
    Proc(1).start() 
    Proc(2).start() 

class Proc (Process): 
    def __init__ (self, procNum): 
     self.id = procNum 
     Process.__init__(self) 

    def run (self): 
     doneWork = False 

     while True: 

      try: 
       # Do work... 
       time.sleep(1) 
       sys.stdout.write('.') 

       if doneWork: 
        print "PROC#" + str(self.id) + " Done." 
        break 

      except KeyboardInterrupt: 
       print "User aborted." 
       sys.exit() 

# Main Entry 
if __name__=="__main__": 
    main() 

Проблема заключается в том, что при использовании CTRL-C для выхода, я получите дополнительную ошибку, даже если процессы, похоже, немедленно выходят:

......User aborted. 
Error in atexit._run_exitfuncs: 
Traceback (most recent call last): 
    File "C:\Python26\lib\atexit.py", line 24, in _run_exitfuncs 
    func(*targs, **kargs) 
    File "C:\Python26\lib\multiprocessing\util.py", line 281, in _exit_function 
    p.join() 
    File "C:\Python26\lib\multiprocessing\process.py", line 119, in join 
    res = self._popen.wait(timeout) 
    File "C:\Python26\lib\multiprocessing\forking.py", line 259, in wait 
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs) 
KeyboardInterrupt 
Error in sys.exitfunc: 
Traceback (most recent call last): 
    File "C:\Python26\lib\atexit.py", line 24, in _run_exitfuncs 
    func(*targs, **kargs) 
    File "C:\Python26\lib\multiprocessing\util.py", line 281, in _exit_function 
    p.join() 
    File "C:\Python26\lib\multiprocessing\process.py", line 119, in join 
    res = self._popen.wait(timeout) 
    File "C:\Python26\lib\multiprocessing\forking.py", line 259, in wait 
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs) 
KeyboardInterrupt 

Я запускаю Python 2.6 на Windows. Если есть лучший способ обработки многопроцессорности в Python, сообщите мне.

ответ

1

Вместо того, чтобы просто форсировать sys.exit(), вы хотите отправить сигнал в свои потоки, чтобы сообщить им остановиться. Посмотрите на использование signal handlers и потоков в Python.

Вы могли бы потенциально сделать это, изменив while True: цикл, чтобы быть while keep_processing: где keep_processing является своего рода глобальную переменную, которая получает набор на исключение KeyboardInterrupt. Я не думаю, что это хорошая практика.

+0

Если возможно, можете ли вы добавить исполняемый пример этого решения. – cmcginty

Смежные вопросы