2013-09-24 4 views
2

대상 기능이 입력 및 출력 대기열을 사용하는 객체가 multiProcessing.Process입니다.포인터가있는 다중 처리 및 ctype

출력 대기열에는 내부 포인터가있는 랩된 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

이하입니다. 포인터는 다른 프로세스에서 유효하지 않습니다.

포인터를 사용하지 않고 개체를 파이썬 개체 또는 ctypes 형식으로 변환하면 제대로 작동합니다.

다른 프로세스에서 발생하는 개체의 변경 사항은 개체를 큐에 다시 보내지 않으면 부모 개체에 반영되지 않습니다.