1

マルチプロセッシングを使用してリストを返そうとしていますが、すべてのプロセスが完了するまで待機する代わりに、次のように mp_factorizer の 1 つの return ステートメントから複数の戻り値を取得します。

None
None
(returns list)

この例では、2 つのスレッドを使用しました。5 つのスレッドを使用した場合、リストが出力される前に 5 つの None が返されます。コードは次のとおりです。

def mp_factorizer(nums, nprocs, objecttouse):
    if __name__ == '__main__':
        out_q = multiprocessing.Queue()
        chunksize = int(math.ceil(len(nums) / float(nprocs)))
        procs = []
        for i in range(nprocs):
            p = multiprocessing.Process(
                    target=worker,                   
                    args=(nums[chunksize * i:chunksize * (i + 1)],
                          out_q,
                    objecttouse))
            procs.append(p)
            p.start()

        # Collect all results into a single result dict. We know how many dicts
        # with results to expect.
        resultlist = []
        for i in range(nprocs):
            temp=out_q.get()
            index =0
            for i in temp:
                resultlist.append(temp[index][0][0:])
                index +=1

        # Wait for all worker processes to finish
        for p in procs:
            p.join()
            resultlist2 = [x for x in resultlist if x != []]
        return resultlist2

def worker(nums, out_q, objecttouse):
    """ The worker function, invoked in a process. 'nums' is a
        list of numbers to factor. The results are placed in
        a dictionary that's pushed to a queue.
    """
    outlist = []
    for n in nums:        
        outputlist=objecttouse.getevents(n)
        if outputlist:
            outlist.append(outputlist)   
    out_q.put(outlist)

mp_factorizer は、項目のリスト、スレッドの数、およびワーカーが使用するオブジェクトを取得し、項目のリストを分割して、すべてのスレッドが同じ量のリストを取得し、ワーカーを開始します。次に、ワーカーはオブジェクトを使用して、指定されたリストから何かを計算し、結果をキューに追加します。Mp_factorizer は、キューからすべての結果を収集し、それらを 1 つの大きなリストにマージして、そのリストを返すことになっています。ただし、複数の返品があります。

私は何を間違っていますか?それとも、ウィンドウがマルチプロセッシングを処理する奇妙な方法が原因で、これは予想される動作ですか? (Python 2.7.3、Windows7 64bit)

EDIT:問題はの間違った配置でしif __name__ == '__main__':た。完全な説明については、サブプロセスでのマルチプロセッシングの使用を参照してください。

4

2 に答える 2

0

あなたのif __name__ == '__main__'発言は間違った場所にあります。printサブプロセスがその行を実行しないようにするには、ステートメントの前後に配置します。

if __name__ == '__main__':
    print mp_factorizer(list, 2, someobject)

これで、サブプロセスif内で呼び出されたときmp_factorizerに関数が返されます。None

于 2013-01-30T11:00:03.047 に答える