2

私はプロセスのpythonプールを持っています。プロセスのいずれかで例外が発生した場合、プールの実行を終了したいです

プール内のすべてのプロセスに参加したので、参加はすべてのプロセスが終了するのを待ちます。ターゲット関数内で sys.exit(1) を上げると、結合がまだプロセスの完了を待っているため、システムは無限に待機します。

コードで結合を使用しているときに実行を終了する方法

from multiprocessing import Pool
import time
import sys

def printer(ip):
    try:
        for _ in xrange(5):
            print ip+str(_)
            time.sleep(1.0)
    except Exception as e:
        print e
        sys.exit(2)

def test():
    pool = Pool(processes=2)
    for i in ["hello",5]:
        result = pool.apply_async(printer,(i,))
    pool.close()    
    pool.join()
    print "good bye"

test()
4

1 に答える 1

2

親プロセスに操作のステータスを返し、コールバックを使用して失敗に対応するだけです。

import time
from multiprocessing import Pool


def printer(ip):
    try:
        for _ in xrange(5):
            print ip+str(_)
            time.sleep(1.0)
        return True
    except Exception as e:
        print e
        return False


class Worker():
    def __init__(self):
        self.pool = Pool(processes=2)

    def callback(self, result):
        if not result:
            print "Error raised in child process. Terminating.."
            self.pool.terminate()

    def do_job(self):
        for i in ["hello", 5]:
            self.pool.apply_async(printer, (i,), callback=self.callback)
        self.pool.close()
        self.pool.join()
        print "good bye"


def test():
    w = Worker()
    w.do_job()
于 2015-01-11T20:50:15.727 に答える