2

マルチプロセッシングとキューを使用して生産者/消費者シナリオを実装しようとしています。メインプロセスはプロデューサーであり、2つのサブプロセスがキューからのデータを消費します。これは異常なことは何も起こらないうちに機能しますが、ツイストは、ワーカーが死亡した場合にワーカーを再起動できるようにしたいということです(kill -9 workerpid)。ただし、一方または両方のワーカーを強制終了すると、メインプロセスがキューにデータを詰め続けていても、「キューは空でした」と表示され始めます。

ここで何が欠けていますか?(Ubuntu12.04でPython2.7.3を使用)

import sys
import time

import multiprocessing
from Queue import Empty

workers = []
fqueue = multiprocessing.Queue()

class Worker(multiprocessing.Process):
    def run(self):
        queue = self._args[0]
        print "{0} starting up, queue at: {1}".format(self.pid, queue)
        while True:
            try:
                obj = queue.get(block=True, timeout=1)
                print "{0}: got from queue: {1}".format(self.pid, obj)
            except Empty:
                print "{0}: queue was empty".format(self.pid)
                continue
            except IOError, e:
                print "{0}: got IOError on queue: {1}".format(self.pid, e)
                return

if __name__ == "__main__":
    print "zipper starting up (2 workers)"
    for _ in range(0, 2):
        p = Worker(args=(fqueue,)) 
        workers.append(p)
        p.start()

    cnt = 0
    while True:
        for i in range(0, len(workers)):
            p = workers[i]
            if not p.is_alive():
                print "main: worker {0} is not alive".format(p.pid)
                p = Worker(args=(fqueue,))
                print "main: restarted worker: {0}".format(p)
                p.start()
                workers[i] = p
        print "main: tick"
        cnt += 1
        fqueue.put(cnt)
        time.sleep(2)
4

1 に答える 1

5

ドキュメントの警告を見たことがありますか?:

警告

プロセスがキューを使用しようとしているときにProcess.terminate()またはos.kill()を使用してプロセスを強制終了すると、キュー内のデータが破損する可能性があります。これにより、他のプロセスが後でキューを使用しようとしたときに例外が発生する可能性があります。

したがって、キューを使用しているプロセスを強制終了すると、キュー全体が使用できなくなる可能性があります。

于 2012-05-29T08:50:24.543 に答える