2009-05-19 43 views
7

私はPythonで単純な複数のプロセスアプリケーションを実行しようとしています。メインスレッドは1からNのプロセスを生成し、処理が完了するまで待機します。プロセスそれぞれが無限ループを実行するので、彼らは潜在的にいくつかのユーザーを中断することなく永遠に実行することができますので、私はKeyboardInterruptを処理するためにいくつかのコードを入れ:Pythonマルチプロセッシング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が終了していること、Iプロセスが直ちに終了するように見えても、追加のエラーが発生します。

......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でマルチプロセッシングを処理するより良い方法があれば、教えてください。

答えて

1

ちょうどsys.exit()を強制するのではなく、スレッドに信号を送信して停止するようにしたいとします。 signal handlersとスレッドをPythonで使用してみてください。

while True:ループをwhile keep_processing:に変更すると、可能性があります。keep_processingは、KeyboardInterrupt例外で設定される何らかのグローバル変数です。私はこれが良い練習だとは思わない。

+0

可能であれば、このソリューションの実行可能な例を追加できますか? – cmcginty

関連する問題