How to resize a shared memory in Python

烂漫一生 提交于 2019-12-25 04:37:15

问题


I want to use an array for shared memory. The problem is the program is structured in such a way that the child processes are spawned before I know the size of the shared array. If I send a message to extend the array nothing happens and if I try to send the shared array itself I get an error. Below is a small script to demonstrate my problem.

import multiprocessing as mp 
import numpy as np

def f(a,pipe):
    while True:
        message, data = pipe.recv()
        if message == 'extend':
            a = np.zeros(data)
            print a
        elif message == 'exit':
            break


if __name__ == '__main__':

    unshared_arr = np.zeros(1)
    a = mp.Array('d', unshared_arr)

    p1,p2 = mp.Pipe()

    p = mp.Process(target=f, args=(a,p2))
    p.start()


    p1.send(('extend', 10))

    p1.send(('exit', None))

    p.join()

    b = np.frombuffer(a.get_obj())

回答1:


try :

unshared_Arr = mp.Array(ctypes.c_uint8,SIZE_NEEDED) #should be size 
                                                    #and not the array itself
np_shared = np.frombuffer(ushared_Arr.get_obj(),dtype=ctypes.c_uint8)
np_shared.reshape(SIZE_NEEDED/2,SIZE_NEEDED/2)  #or (,SIZE_NEEDED) ie. any shape 
                                                #you want as long as the allocated size 
                                                #does not change

now use np_shared as you would any numpy array. You should keep it global if multiple processes are going to need it.



来源:https://stackoverflow.com/questions/41037808/how-to-resize-a-shared-memory-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!