相关疑难解决方法(0)

使用多处理Pool.map()时无法pickle <type'instancemethod'>

我想使用multiprocessingPool.map()功能,同时划分出工作.当我使用以下代码时,它工作正常:

import multiprocessing

def f(x):
    return x*x

def go():
    pool = multiprocessing.Pool(processes=4)        
    print pool.map(f, range(10))


if __name__== '__main__' :
    go()
Run Code Online (Sandbox Code Playgroud)

但是,当我在面向对象的方法中使用它时,它不起作用.它给出的错误信息是:

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup
__builtin__.instancemethod failed
Run Code Online (Sandbox Code Playgroud)

当以下是我的主程序时会发生这种情况:

import someClass

if __name__== '__main__' :
    sc = someClass.someClass()
    sc.go()
Run Code Online (Sandbox Code Playgroud)

以下是我的someClass课程:

import multiprocessing

class someClass(object):
    def __init__(self):
        pass

    def f(self, x):
        return x*x

    def go(self):
        pool = multiprocessing.Pool(processes=4)       
        print pool.map(self.f, range(10))
Run Code Online (Sandbox Code Playgroud)

任何人都知道问题可能是什么,或者一个简单的方法呢?

python multithreading pool pickle multiprocessing

206
推荐指数
6
解决办法
12万
查看次数

腌制定义为具有PyObject *成员的C结构的Python扩展类型

我正在通过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;`
Run Code Online (Sandbox Code Playgroud)

这是Py_TypeObject

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

这是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 = …
Run Code Online (Sandbox Code Playgroud)

c python struct pickle pyobject

5
推荐指数
1
解决办法
991
查看次数

标签 统计

pickle ×2

python ×2

c ×1

multiprocessing ×1

multithreading ×1

pool ×1

pyobject ×1

struct ×1