6

Python経由でC++コードを実行していて、拡張タイプを選択したいと思います。

したがって、Pythonタイプのオブジェクト(t_db_manager)でラップしたデータベースオブジェクトとオブジェクトマネージャーオブジェクト(どちらもC ++で記述)へのポインターを含むC ++構造(py_db_manager)があります。私の問題は、このpythonタイプは、いくつかの子マルチコアプロセスに送信するために、2つのポインターをピクルスにする方法を知っている必要があるということです。そこで、型をcopy_regモジュールに登録しました(これは、型にreduce()メソッドを記述することと同じです。ただし、何を入れるかがよくわかりません。PyObject*を使用してタプルを作成する必要があります。整数ポインタ?。誰か助けてもらえますか?

typedef struct
{
  PyObject_HEAD
  PyObject* man_inst_ ;
  PyObject* db_inst_ ;

}py_db_manager;`

これがPy_TypeObjectです

PyTypeObject t_db_manager = {
    PyObject_HEAD_INIT(0)               /* tp_head */
    0,                                  /* tp_internal */
    ".py_db_manager",                  /* tp_name */
    sizeof(py_db_manager)};

そして、 reduceメソッドに含まれるコードは次のとおりです。

PyObject *pickle_manager(PyObject *module, PyObject *args)
{
    py_db_manager *cpp_manager =0;
    PyObject *values = NULL,
        *tuple = NULL;
    char text[512];

    if (!PyArg_ParseTuple(args, "O!", &t_db_manager, &cpp_manager))
        goto error;
    sprintf(text,"man_inst_, db_inst_");
    if ((values = Py_BuildValue("(sii)", text,
                                cpp_manager->man_inst_, cpp_manager->db_inst_)) == NULL)
        goto error;
    tuple = Py_BuildValue("(OO)", manager_constructor, values);

error:
    Py_XDECREF(values);
    return tuple;
}
4

1 に答える 1

2

これは別のプロセスに渡されるため、整数ポインターだけをピクルすると、期待どおりに動作しません。異なるプロセスは異なるメモリ空間を使用するため、同じものは表示されません。

したがって、あなたの質問に答えるには、完全なオブジェクトをピクルして、受信側から再構築する必要があります。

于 2011-05-14T06:07:57.567 に答える