多处理和带指针的ctypes

Fel*_*lix 6 python ctypes multiprocessing libsvm

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

在输出队列中,他们放置了一些数据,即带有内部指针的包装ctypes结构.当然,pickle应该序列化数据的模块会破坏:

ValueError:包含指针的ctypes对象无法进行pickle

我可以以某种方式从我的子进程中获取带有指针的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()
Run Code Online (Sandbox Code Playgroud)

小智 8

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

将对象转换为python对象或没有指针的ctypes类型,它应该工作.

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

  • “将对象转换为 python 对象或没有指针的 ctypes 类型”在实践中意味着什么? (3认同)