0

私はPythonとC拡張が初めてです。私は 2 つのスレッドを作成し、コールバック関数 py_cb() を定義した Python コードを書いています。あるスレッドでは、特定の時間間隔の後にグローバル リストに追加していますが、別のスレッドでは、C 拡張ライブラリ API を呼び出しています。C 拡張 API は、元のファイルで定義された Python コールバック関数 (py_cb) を呼び出すスレッドを生成します。コールバック関数で、グローバルリストを表示しようとしているのですが、IDが違うようです。id(listName) を使用して確認しました。C 拡張 Python コールバック関数で正しいグローバル変数を使用する方法はありますか? グローバル値はすべてのスレッドで共有されると想定していましたが、そうではありませんか? また、より良い解決策を提案してください。

以下は C コードです。

char *MODULE_NAME = "simple";
---

PyMODINIT_FUNC init_cmodule(void)
{
    PyObject *m = Py_InitModule3("_cmodule",module_methods,module_docstring);
    if (m == NULL)
    return;
}

static PyObject *cmodule_cmodule(PyObject *self, PyObject *args)
{
    int value = register_cb();
    PyObject *ret = Py_BuildValue("i",value);
    return ret;
}


void notifyFooHandle()
{
    printf("inside the notify_foo function\n");
    pModule = PyImport_ImportModule(MODULE_NAME);
    if (!pModule) {
        printf ("Failed to load the module\n");
        return;
    }
    PyObject *pFunc;
    pFunc = PyObject_GetAttrString(pModule, "py_cb");
    if (pFunc && PyCallable_Check(pFunc)) {
        PyObject_CallObject(pFunc,NULL);

    }
    else {
        Py_DECREF(pFunc);
        PyErr_Print();
        printf("Failed to send notification\n");
        return;
    }
    return;
}

void notify_foo(void)
{
    int t = 5;

    while (t < 10) {
        notifyFooHandle();
        sleep(5);
        t++;
    }
    return;
}

int register_cb(void)
{
    pthread_t notify_t;
    int rc = pthread_create(&notify_t, NULL, (void *) &notify_foo,NULL);
---
}

以下は、simple.py ファイルの python コールバック API です。

def py_cb():
    print "Received a call back from cmodule"
    global myList
    print "Global myList is ", id(myList)
    print myList
    return
4

1 に答える 1