gpt4 book ai didi

python - 线程化Python和C绑定(bind)同步

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:24 25 4
gpt4 key购买 nike

我正在致力于为我的实时 C 库实现 Python 绑定(bind)。我读过,Python 中的线程不是实际的线程,并且它们并不真正并行运行(因为全局解释器锁)。不过,我必须考虑以下情况。

想象一下以下 C 函数:

int stoppable_lock(mutex *m, bool *stop)
{
while (!stop || !*stop)
if (timed_lock(m, SOME_TIME) == SUCCESS)
return SUCCESS;
return DIDNT_LOCK;
}

该函数等待互斥体,但可以通过使用stop取消。在最简单的情况下,能够优雅地停止使用它的线程,无论互斥锁的其他用户发生什么情况(例如,如果他们在持有锁时死亡)。

我的问题是弄清楚如何为此函数编写 Python 包装器。通过解析参数(使用PyArg_ParseTuple),我可以检索互斥体,没有问题。然而,可以发送到函数seem to be的东西类型字符串、数字和对象。前两个显然不能替代 bool *,而且我怀疑为 bool * 编写包装器是一个好主意。

我的问题是,如何获取一个参数,该参数是对变量(与其他 python 线程共享)的引用,而不仅仅是它的副本?

这是我缺少的函数(对于像 mutex.stoppable_lock(stop) 这样的用法):

static PyObject *_stoppable_lock(_mutex *obj, PyObject *args)
{
int ret;
BOOL_STAR stop;
if (!PyArg_ParseTuple(args, "?", &stop))
{
PyErr_SetString(PyExc_ValueError, "Usage: mutex.stoppable_lock(BOOL_STAR)");
return NULL;
}
ret = stoppable_lock(obj->orig, stop);
if (_set_exception(ret))
return NULL;
Py_RETURN_NONE;
}

我不知道 BOOL_STAR"?" 应该是什么。

最佳答案

您需要为 bool 创建一个包装类型,并使用用于嵌入值的 Python 变异函数。如果您想避免创建自己的类型,并且您相信 C _Bool 与 C++ bool 相同,那么您可以使用 ctypes.c_bool 。 Python 脚本可以执行以下操作

   stop = ctypes.c_bool(False)
stoppable_lock(mutex, ctypes.addressof(stop))

然后另一个线程可以执行stop.value = True。扩展模块需要一个 long,然后将其转换为指针。如果您希望类型更加安全,则需要为 bool 创建自己的包装类型。

关于python - 线程化Python和C绑定(bind)同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14607316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com