2016-05-05 32 views
1

我想在多處理(https://docs.python.org/2/library/multiprocessing.html)創建的線程之間共享一個3 gb的bitarray(https://pypi.python.org/pypi/bitarray/0.8.1)。python多處理:共享比特數組(bitarray 0.8.1)

我只想讀取bitarray而不修改它。下面的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

多處理不創建線程,它創建*進程*。 –

回答

1

這將工作用fork語義multiprocessing一個POSIX系統上,而不是使用Windows系統上spawn語義。 fork語義將相同的內存映射到父代和子代(寫時複製,因此如果在一箇中更改,則數據在其他中保持不變); spawn語義啓動新鮮的Python進程。

另外,側面說明,在Windows上,我想你想的進口後衛避免「fork炸彈」之類的情況下,不調用main在模塊級無條件,而是保護它:

if __name__ == '__main__': 
    main() 

所以當生成的孩子導入主模塊爲「不主要」時,它不會嘗試重新調用main函數。

-1

您的腳本不可導入。

替換最後一行:

main() 

與以下兩行:

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

這不是一個答案。 – ShadowRanger