我有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()
答案 0 :(得分:7)
使用多处理时,每个进程都有自己的地址空间。指针在另一个进程中无效。
将对象转换为python对象或没有指针的ctypes类型,它应该可以工作。
请记住,除非您将对象重新发送回队列,否则对其他进程中发生的对象的更改不会反映在父进程中。