2

Python でマルチプロセッシングを理解しようとしています。

リストのセットから最大数を見つけるテスト プログラムを作成しました。限られた数のプロセスでは問題なく動作しますが、数を増やして 5000 プロセスにすると、ある時点でプログラムがハングします。

私は何か間違ったことをしていますか?プロセス数を増やすとハングするのはなぜですか?

これが私のコードです:

from  multiprocessing import Process, Manager
import numpy.random as npyrnd

def getMaxRand(_num, shared_dict):
    '''
    create a list of random numbers
    picks max from list
    '''
    print 'starting process num:', _num
    rndList = npyrnd.random(size= 100)
    maxrnd = max(rndList)
    print 'ending process:', _num
    shared_dict[_num] = maxrnd



if __name__ == '__main__':
    processes = []
    manager = Manager()
    shared_dict= manager.dict()  
    for i in range(50): #hangs when this is increased to say 5000
        p = Process(target=getMaxRand, args=( i, shared_dict))
        processes.append(p)
    for p in processes:
        p.start()
    for p in processes:
        p.join()


    print shared_dict

編集:いくつかの応答を読んだ後、多くのプロセスを任意に作成することはできないことは明らかであり、マルチプロセッシング ライブラリがそれらをキューに入れることを願っています。したがって、私にとってのフォローアップの質問は、同時に実行できるプロセスの最大数をどのように決定できますか?

4

1 に答える 1

2

PC をハングアップさせる多数のプロセスをなんとか克服しました。かなり多数のプロセスで機能しているようです(50000までテストしました)

これは私が問題にアプローチした方法です:

from  multiprocessing import  Pool
import numpy.random as npyrnd


full_result = {}

def getMaxRand(_num):
    '''
    create a list of random numbers
    picks max from list
    '''
    print 'starting process num:', _num
    rndList = npyrnd.random(size= 100)
    maxrnd = max(rndList)
    print 'ending process:', _num

    return (_num, maxrnd)

def accumulateResults(result):
    print 'getting result' , result
    full_result[result[0]] = result[1]

def doProcesses():
    pool = Pool(processes=8)    
    for i in range(5000): #if I increase this number will it crash?
        pool.apply_async(getMaxRand, args=( i, ), callback=accumulateResults)
    pool.close()
    pool.join()



if __name__ == '__main__':
    doProcesses()
    print 'FINAL:', full_result

この方向性を教えてくれた @mgilson と @Kylo に感謝します。

于 2013-05-21T14:10:12.437 に答える