Python Multiprocessing atexit Error " ошибка в atexit. запустить exitfuncs"

Я пытаюсь запустить простое приложение с несколькими процессами в Python. Основной поток порождает от 1 до N процессов и ждет, пока все они не завершат обработку. Каждый процесс выполняет бесконечный цикл, поэтому они могут работать вечно без прерывания пользователя, поэтому я ввел некоторый код для обработки KeyboardInterrupt:

#!/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:Python26libatexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "C:Python26libmultiprocessingutil.py", line 281, in _exit_function
    p.join()
  File "C:Python26libmultiprocessingprocess.py", line 119, in join
    res = self._popen.wait(timeout)
  File "C:Python26libmultiprocessingforking.py", line 259, in wait
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
KeyboardInterrupt
Error in sys.exitfunc:
Traceback (most recent call last):
  File "C:Python26libatexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "C:Python26libmultiprocessingutil.py", line 281, in _exit_function
    p.join()
  File "C:Python26libmultiprocessingprocess.py", line 119, in join
    res = self._popen.wait(timeout)
  File "C:Python26libmultiprocessingforking.py", line 259, in wait
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
KeyboardInterrupt

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

1 ответов


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

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