18

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:\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上でPython2.6を実行しています。Pythonでマルチプロセッシングを処理するためのより良い方法がある場合は、私に知らせてください。

4

2 に答える 2

1

を強制するだけでなくsys.exit()、スレッドにシグナルを送信して停止するように指示します。Python でのシグナル ハンドラーとスレッドの使用を検討してください。

while True:ループを変更して、KeyboardInterrupt 例外で設定されるある種のグローバル変数があるwhile keep_processing: 場所に変更することで、これを実行できる可能性があります。keep_processingしかし、これは良い習慣ではないと思います。

于 2009-05-19T15:36:09.673 に答える