【问题标题】:Pickling a Python Extension type defined as a C struct having PyObject* members腌制定义为具有 PyObject* 成员的 C 结构的 Python 扩展类型
【发布时间】:2011-08-25 03:47:39
【问题描述】:

我正在通过 Python 运行 C++ 代码,并希望挑选一个扩展类型。

所以我有一个 C++ 结构 (py_db_manager),其中包含指向数据库对象和对象管理器对象(均用 C++ 编写)的指针,我用 python 类型对象 (t_db_manager) 包装了该结构。我的问题是这个 python 类型需要知道如何腌制两个指针才能将它发送到一些子多核进程。所以我用 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;
}

【问题讨论】:

    标签: python c struct pickle pyobject


    【解决方案1】:

    因为这将被传递给另一个进程,所以只腌制整数指针不会像您希望的那样工作。不同的进程使用不同的内存空间,因此它们看到相同的东西。

    因此,要回答您的问题,您应该腌制完整的对象并从接收端重建它们。

    【讨论】:

    • 实际上,这就是整个想法。我希望子进程通过查看 SAME 指针来查看 SAME 数据库并拥有相同的管理器。我计划通过使用 sharedctypes 模块并调用 shareddata=sharedctypes.Value(anInstanceof_t_db_manager) 来做到这一点。尽管如此,共享数据在发送给孩子时会被腌制
    • 不过,您不能只转移指针!例如,假设在父进程中,您的指针指向 0x87654321。如果将此指针传递给子进程,它仍然会看到 0x87654321,但在该地址处可能与父进程中的完全不同。
    • 那么当python产生子进程时,它是否会将父进程的内存表复制到每个子进程中?这就是我在调试时看到的情况:每个子进程都有一个位于不同内存地址的数据库实例。您的意思是这些内存地址不是“全局的”而是特定于进程的?有没有办法告诉子进程使用在父进程地址找到的数据库?
    • 有办法的。它被称为共享内存。据我所知,纯 Python 无法做到这一点。
    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2012-10-25
    相关资源
    最近更新 更多