2013-09-24 231 views
2

我有multiProcessing.Process对象,其目标函数采用输入和输出队列。多处理和带指针的ctypes

给输出队列放置一些数据,这是一个带有内部指针的包装ctypes结构。当然,pickle模块,即应序列数据,打破:

ValueError: ctypes objects containing pointers cannot be pickled

我可以以某种方式得到我的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() 

回答

4

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

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

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