2016-05-05 12 views
1

マルチプロセッシング(https://docs.python.org/2/library/multiprocessing.html)で作成されたスレッド間に3ギガバイトのビット配列(https://pypi.python.org/pypi/bitarray/0.8.1)を共有します。Pythonマルチプロセッシング:共有ビット配列(bitarray 0.8.1)

私はそれを変更せずにビット配列を読みたいだけです。次のpython 2.7コードは本当に大丈夫ですか?どうにかして、ctypes(docs.python.org/2/library/ctypes.html)を使用せずに動作するようです。

import multiprocessing as mp 
import bitarray 
import time 
def f(x): 
    n = 0 
    #print shared_arr[n:(10+n)] & shared_arr[n:(10+n)] 
    print "worker %d started at time %s" % (x, str(time.time()-start_time)) 
    print "running %d. bit %d of shared array is: " % (x, x) +str(shared_arr[n:(10+n)]) 
    time.sleep(2) 
    print "ending %d at time %s" %(x, str(time.time()-start_time)) 
    return x*x 

def main(): 
    print "The number of cpu is %d" % (mp.cpu_count()) 
    num_cpu_core = mp.cpu_count() 
    n = 0 
    global shared_arr 
    global start_time 
    start_time = time.time() 
    shared_arr = bitarray.bitarray(18) 
    shared_arr[:] = 0 
    shared_arr[(n+5):(n+7)] = 1 
    a = 10 
    pool = mp.Pool(processes = num_cpu_core) # not saving one for the master process 
    pool.map_async(f, range(10)) 
    pool.close() 
    pool.join() 

main() 
+0

マルチプロセッシングはスレッドを作成しないので、* processes *を作成します。 –

答えて

1

:次の2行と

main() 

spawn意味論。 forkセマンティクスは、同じメモリを親と子にマッピングします(コピーオンライトなので、1つに変更されてもデータは同じままです)。 spawnセマンティクスは新鮮なPythonプロセスを起動します。

また、サイドノートでは、Windows上で、私はあなたのシナリオのような「フォーク爆弾」を回避するために、インポートガードをしたいと思います、無条件モジュールレベルでmainを呼び出しませんが、とそれを守る:

if __name__ == '__main__': 
    main() 

したがって、生成された子がメインモジュールを "not main"としてインポートするとき、あなたのmain関数を再呼び出ししようとしません。

-1

スクリプトはインポートできません。

最後の行に置き換えます。これは、multiprocessingためforkセマンティクスを使用してPOSIXシステムではなく、使用するWindowsシステム上で動作します

if __name__ == "__main__": 
    main() 
+1

これは答えではありません。 – ShadowRanger

関連する問題