将 multiprocessing.Value 对象传递给 ctype 函数?

Posted

技术标签:

【中文标题】将 multiprocessing.Value 对象传递给 ctype 函数?【英文标题】:Passing multiprocessing.Value object into a ctype function? 【发布时间】:2020-01-25 18:11:32 【问题描述】:

我正在使用一个 python 函数,该函数从传递给它的 python 的多处理库中获取一个 Value 对象,并且需要使用 ctype 函数来修改它。问题是我找不到好方法,我不确定是否可以将 Value 对象传递给 ctype 函数,以便修改值。

我的 python 代码如下所示:

#main.py
import ctypes, glob
from multiprocessing import Value

libfile = glob.glob('build/*/mod_func*.so')[0]
mylib = ctypes.CDLL(libfile)

test_value = Value("i", -99)
mylib.mod_func.argtypes = [ctypes.c_int]

print(test_value.value)
mylib.mod_func(test_value.value)
print(test_value.value)

我正在构建的 C++ 代码如下所示:

//testcode.cpp
extern "C"
void mod_func(int &val)

   val = 10;

我用命令python setup.py build构建了C++代码,其中setup.py如下:

from setuptools import setup, Extension
setup(
   ext_modules=[Extension('mod_func', ['testcode.cpp'],),],
)

当我运行main.py 时,我得到的输出是:

-99
Segmentation fault (core dumped)

该错误可能是由于我试图将 Value.value 传递给我的 ctype 函数引起的,但我不确定我还能做什么。我不能只使用 ctype 函数返回的值,因为我的主要 python 代码将在线程中运行并在 ctype 函数完成执行之前的某个时间点强制终止,所以我想迭代地更新传入的值线程终止时可以查看的ctype函数。

有什么想法吗?

【问题讨论】:

extern "C"void mod_func(int &val) 似乎很奇怪。 C 不支持引用。 哦,那么段错误可能是由同时使用引用和extern "C" 引起的?如果是这种情况,是否可以使用 ctype 库的功能来完成我想要做的事情? 【参考方案1】:

嗯,我设法通过使用回调函数找到了我正在寻找的功能。

更新的 Python 代码:

#main.py
import ctypes, glob
from multiprocessing import Value

libfile = glob.glob('build/*/mod_func*.so')[0]
mylib = ctypes.CDLL(libfile)

test_value = Value("i", -99)
print("Before:", test_value.value)
@ctypes.CFUNCTYPE(None, ctypes.c_int)
def callback(new_val):
   test_value.value = new_val

mylib.mod_func(callback, 10)
print("After:", test_value.value)

更新的 C++ 代码:

extern "C"
void mod_func(void (*f)(int), int val)

   f(val);

输出:

Before: -99
After: 10

【讨论】:

你不能以某种方式传递给 C 函数一个指针使它:void mod_func(int* val) 然后在它里面做*val = 10;?似乎这比回调的开销要少得多……

以上是关于将 multiprocessing.Value 对象传递给 ctype 函数?的主要内容,如果未能解决你的问题,请参考以下文章

python多进程共享变量Value使用tips

具有多处理锁的共享计数器在 Windows 中不起作用

python(面试题一)

python面试题37道(附答案)看完面试不愁了

将“对”列表转换为字典字典?

如何将嵌套数组对转换为数组中的对象