Pythonのマルチプロセッシングのatexitエラー「atexit._run_exitfuncsでエラーが発生しました」

StackOverflow https://stackoverflow.com/questions/883370

質問

私はPythonで簡単な複数のプロセスアプリケーションを実行しようとしています。メインスレッドは、N個のプロセスに1を生成します、それらはすべてが処理行われるまで待機します。プロセスそれぞれが無限ループを実行するので、彼らは潜在的にいくつかのユーザーを中断することなく永遠に実行することができますので、私は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:\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

私はWindows上のPython 2.6を実行しています。 Pythonでマルチプロセッシング処理するためのより良い方法があれば、私に知らせてくださいます。

役に立ちましたか?

解決

というし、ちょうどsys.exit()を強制的に、あなたが停止するためにそれらを伝えるために、あなたのスレッドにシグナルを送りたいです。 Pythonでシグナルハンドラと糸を使用してに見てます。

あなたは、潜在的while True:はKeyboardInterrupt例外に設定されますグローバル変数のいくつかの並べ替えがどこにあるwhile keep_processing:するためにあなたのkeep_processingループを変更することでこれを行うことができます。私はこれはしかし良い習慣ではないと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top