Python C API允许使用静态变量阻塞线程

问题描述

我正在包装使用全局定义函数作为回调的库。

void library_callback(size_t id,char *buf,size_t len);

library_callback函数在内部由库调用,但我可以通过公共API设置此函数

我想创建在每次回调执行时都会被调用的侦听器(Python可调用对象)列表。

static PyObject *listeners = NULL; // initialize later as PyList_New(...)

void library_callback(size_t id,size_t len) {
    for (size_t i = 0,count = PyList_Size(listeners); i < count; i++) {
        PyObject *listener = PyList_GetItem(listeners,i);
        // call listener with id and buf
    }
}

在我用library_callbackPy_BEGIN_ALLOW_THREADS包装Py_END_ALLOW_THREADS之前,它工作得很好。 但是如果没有Py_*_ALLOW_THREADS库正在阻塞模式下工作(即使我尝试执行Thread(target=myfunc)也是如此)。

我创建了一种简单的方法来检查问题是否与静态变量有关。

PyObject *TestObject_Test(PyObject *self,PyObject *noargs) {
    static PyObject *variable = NULL;
    if (variable == NULL) {
        variable = PyUnicode_FromString("variable");
    }
    Py_BEGIN_ALLOW_THREADS
    printf("variable\t%s\n",PyUnicode_AsUTF8(PyUnicode_FromFormat("%r",variable)));
    Py_END_ALLOW_THREADS
    return Py_INCREF(variable),variable;
}

然后在下面的代码后我得到了fish: 'python3' terminated by signal SIGSEGV (Address boundary error)

obj = TestObject()
obj.test()

如何正确编写此代码并获得在后台运行回调的功能

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)