带指针的多处理和 ctypes

Posted

技术标签:

【中文标题】带指针的多处理和 ctypes【英文标题】:multiprocessing and ctypes with pointers 【发布时间】:2013-09-29 09:26:27 【问题描述】:

我有 multiProcessing.Process 对象,其目标函数采用输入和输出队列。

他们将一些数据放入输出队列,这是一个带有内部指针的包装 ctypes 结构。当然,应该序列化数据的pickle 模块会中断:

ValueError: ctypes 包含指针的对象不能被腌制

我能否以某种方式从我的子进程中获取带有指针的 ctypes 结构而不将它们转储到文件中?

代码如下

# -*- coding: utf-8 -*-
import multiprocessing as mp

from liblinear import *
from liblinearutil import *


def processTarget(inQueue, outQueue):
    while(not inQueue.empty()):
        inVal = inQueue.get()

        #training model
        y, x = [1,-1], [1:inVal, 3:3*inVal, 1:-1,3:-1]
        prob  = problem(y, x)
        param = parameter('-c 4 -B 1')
        m = train(prob, param)


        outQueue.put((inVal * 2, m))
        print "done", inVal
        inQueue.task_done()

def Main():
    processes = []
    inQueue = mp.JoinableQueue()
    for i in xrange(10):
        inQueue.put(i)

    outQueue = mp.JoinableQueue()
    for i in xrange(5):
        process = mp.Process(target=processTarget, args=(inQueue, outQueue))
        print "starting", i
        process.start()
        print "started", i
    inQueue.join()

    print "JOINED"

    while(not outQueue.empty()):
        print outQueue.get()



if __name__ == '__main__':
    Main()

【问题讨论】:

【参考方案1】:

当您使用多处理时,每个进程都有自己的地址空间。该指针在另一个进程中无效。

将对象转换为 python 对象或不带指针的 ctypes 类型,它应该可以工作。

请记住,除非您将对象发送回队列中,否则其他进程中发生的对象更改不会反映在父进程中。

【讨论】:

“将对象转换为 python 对象或不带指针的 ctypes 类型”在实践中是什么意思? @onurcanbektas 该操作表示他们有一个当前具有指针的 ctypes 对象。实际上,这意味着创建一个与 ctypes 对象具有相同内容的普通 python 类,或者确保 ctypes 对象没有对其他对象的任何引用。这可以通过用对象实际包含另一个指针来替换指针来完成。

以上是关于带指针的多处理和 ctypes的主要内容,如果未能解决你的问题,请参考以下文章

使用 ctypes 传递结构指针

Python ctypes 中的指针和数组

ctypes 不允许多次取消引用指针

python ctypes:从指针变量中获取指向类型

没有为指向结构的指针调用 ctypes.Structure 子类的 ctypes __del__

ctypes:从任意整数构造指针