2017-01-10 5 views
1

私がしようとしているのは、素数分解のリストをいろいろなプロセスで同時に実行することです。私は動作しているスレッド版を持っていますが、プロセスで動作するようには見えません。プロセスを実行しようとするとピクルエラーが発生する

import math 
from Queue import Queue 
import multiprocessing 

def primes2(n): 
    primfac = [] 
    num = n 
    d = 2 
    while d * d <= n: 
     while (n % d) == 0: 
      primfac.append(d) # supposing you want multiple factors repeated 
      n //= d 
     d += 1 
    if n > 1: 
     primfac.append(n) 
    myfile = open('processresults.txt', 'a') 
    myfile.write(str(num) + ":" + str(primfac) + "\n") 
    return primfac 

def mp_factorizer(nums, nprocs): 
    def worker(nums, out_q): 
     """ 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. 
     """ 
     outdict = {} 
      for n in nums: 
      outdict[n] = primes2(n) 
     out_q.put(outdict) 

    # Each process will get 'chunksize' nums and a queue to put his out 
    # dict into 
    out_q = 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)) 
     procs.append(p) 
     p.start() 

    # Collect all results into a single result dict. We know how many dicts 
    # with results to expect. 
    resultdict = {} 
    for i in range(nprocs): 
     resultdict.update(out_q.get()) 

    # Wait for all worker processes to finish 
    for p in procs: 
     p.join() 

    print resultdict 

if __name__ == '__main__': 

    mp_factorizer((400243534500, 100345345000, 600034522000, 9000045346435345000), 4) 

私は、以下に示すピクルスエラー取得しています:

error image

を任意の助けいただければ幸いです:)

答えて

2

あなたはmultiprocessing.Queueの代わりに、定期的なQueueを使用する必要があります。 +more

これは、プロセスが同じメモリ空間を使用して実行していないと定期的なキューQueue.Queue)のようなpickableではありませんいくつかのオブジェクトが存在するためです。これを克服するために、multiprocessingライブラリはQueueクラスを提供します。このクラスは実際にはキューにProxyです。

また、他の方法としてdef worker(..を抽出することもできます。プロセスがOSレベルで「どのように」フォークされているかによって、これが主な問題になる可能性があります。

multiprocessing.Manager+moreを使用することもできます。

+0

Queue()をmultiprocessing.queue()に変更し、AttributeErrorを取得しました。 'module'オブジェクトに属性 'queue'エラーがありません –

+0

ドキュメントとその答えを慎重にチェックしてください。 'multiprocessing.queue'キャップ、それはマルチプロセッシングです.Queue' –

+0

ありがとう!あなたのソリューションと、Tadhgによって下に掲載されたソリューションの組み合わせは、それを修正しました。ありがとうございました:) –

2

ダイナミックに作成された関数は、ピッキングできないため、Processのターゲットとして使用することはできません。workerは、mp_factorizerの定義の代わりにグローバルスコープで定義する必要があります。

+0

ラファエルとあなたのプログラムを修正してくれてありがとう! –

関連する問題