【发布时间】:2020-06-22 10:19:41
【问题描述】:
我现在需要在 python 中请求数组,并将它们传递给 Cpp 程序,但 python 仍然需要处理它们。但是我发现当我使用多处理时,数组的地址会改变。
以下是我的代码:
//在test.h中导出dll,这个是test.cpp #include “test.h” #include使用命名空间标准; 无效的一些工作(双*数据,长*标志){ cout # test.py import multiprocessing as mp from multiprocessing.sharedctypes import RawArray import ctypes data = RawArray(ctypes.c_double, 2000) flag = RawArray(ctypes.c_long, 20) pkg = ctypes.cdll.LoadLibrary(r"test.dll") pkg.someWork.argtypes = [ ctypes.POINTER(ctypes.c_double * 2000),# dataArray ctypes.POINTER(ctypes.c_long * 20)#flagArray ] def proc_py(): idx = 0 while True: if flag[idx] == 1: # do something flag[idx] = 0 idx = (idx + 1) % 20 def proc_cpp(): pkg.someWork(ctypes.pointer(data), ctypes.pointer(flag)) def main(): p_cpp = mp.Process(target=proc_cpp, args=()) p_py = mp.Process(target=proc_py, args=()) p_cpp .start() p_py .start() p_cpp .join() p_py .join() if __name__ == '__main__': print("py flag address:", ctypes.byref(flag)) # proc_cpp() main()结果是:我刚刚在python中运行
proc_cpp,地址是一样的:py flag address: <cparam 'P' (0000019DA8282400)> cpp flag address: 0000019DA8282400但是当我运行
main时,地址不同:py flag address: <cparam 'P' (000001CB42A32400)> cpp flag address: 0000012F1E152400我知道python的多处理必须使用共享内存在处理之间共享内存,但是我使用
mp.Array/Array.get_obj()和mp.sharedctypes.RawArray/ctypes.pointer()都失败了。有什么办法可以解决我的问题吗?
【问题讨论】:
-
共享内存不一定映射到不同进程中的相同虚拟地址。不要期望地址匹配。
-
@MarkTolonen 谢谢你的回复,但似乎如果我想将数组传递给 c/cpp 程序,我必须传递指针。有什么建议可以满足 c/cpp 和 python 可以在多处理任务中使用共享数组的要求吗?
标签: python-multiprocessing ctypes