0

データベース (およびその他のもの) に対していくつかの要求を行うために、Python で Multiprocessing を使用します。

po = multiprocessing.Pool()
for element in setOfElements:
    results.append(po.apply_async(myDBRequestModule, (element, other stuff...)))                    
po.close()
po.join()
for r in results:
    newSet.add(r.get())

myDBRequestModule は、リストと 2 つの数値で構成される、私が定義したオブジェクトを返します。これらのオブジェクトのセットにおける等価性の意味を定義するために、ハッシュ関数を再定義しました。

class myObject:
    def __init__(self, aList, aNumber, anotherNumber):
        self.list = aList
        self.number1 = aNumber
        self.number2 = anotherNumber
    def __hash__(self):
        # turn elements of list into a string, in order to hash the string
        hash_text = ""
        for element in self.list:
            hash_text += str(element.x.id) # I use the ID of the element of my list...
        return hash(hash_text)
    def __eq__(self, other):
        self_hash_text = ""
        other_hash_text = ""
        for element in self.list:
            self_hash_text += str(element.x.id)
        for element in other.listDest:
            other_hash_text += str(element.x.id)
        return self_hash_text == other_hash_text 

そして、ほとんどの場合、それは正常に機能します。2 回、理由は不明ですが、まったく同じコンテキストで、バグが発生しました。

newSet.add(r.get())
File "/usr/lib/python2.6/multiprocessing/pool.py", line 422, in get
    raise self._value
TypeError: 'str' object does not support item assignment

これは get メソッド (最後の行) から来ています。

def get(self, timeout=None):
    self.wait(timeout)
    if not self._ready:
        raise TimeoutError
    if self._success:
        return self._value
    else:
        raise self._value

このミスは 1 回だけで消えてしまったので、早々にあきらめることにしましたが、最近 2 つ目の問題が発生し、このバグと戦う方法が本当にわかりません。特に、なぜそれがほとんど起こらず、通常は完全に正常に機能するのかを説明するのは困難です。

4

1 に答える 1

1

multiprocessingここでは問題ではありません。

問題を診断するための正しいコードが提供されていません。ある時点で、キャッチされた例外を に割り当てましたself._value。そこでエラーが発生しています。割り当てられているすべての場所をself._value確認すると、このエラーを見つけることができます。

于 2012-11-05T14:02:04.633 に答える