2015-03-30 4 views
0

У меня есть класс, который создает новый процесс в конструкторе, как показано нижесоздание дочернего процесса в конструкторе

class data_reader(): 
def __init__(self,paths_list,queue_limit = 1,parallel = True): 
    print 'data reader constructor' 
    self.paths = paths_list 
    self.count = len(paths_list) 
    self.async = async 
    self.dict = {}; 
    self.lock = multiprocessing.Lock() 
    self.queue = multiprocessing.Queue(queue_limit) 
    if parallel: 
     self.child = multiprocessing.Process(target = self.load_paths,args = (self.paths,self.queue,)) 
     self.child.daemon = True 
     self.child.start() 
     print 'child started' 
    else: 
     self.load_paths(self.paths,self.queue) 

этот класс имеет другую функцию get_next(), чтобы получить данные из очереди

def get_next(): 
     return self.queue.get() 

Эта функция называется такой основной

data_train = data_reader(train_paths_list) 
data_valid = data_reader(valid_paths_list) 
data_test = data_reader(test_paths_list) 

Теперь, когда я запускаю этот код в нормальном сценарии, он отлично работает и chil d процессы прекращаются по мере уничтожения объектов. Проблема возникает, когда я запускаю этот основной в качестве дочернего процесса из другой программы (spearmint https://github.com/JasperSnoek/spearmint). Вызов конструктора никогда не возвращается, но создается новый ребенок. В других случаях ребенок создается, но сообщение

'data reader constructor' 

не печатается, и элемент управления не возвращается родительскому объекту.

Есть некоторые ограничения, которые я не могу понять.

PS. Я думаю использовать программирование сокетов, чтобы избежать этого сценария.

ответ

0

Я унаследовал data_reader от процесса, как

class data_reader(multiprocessing.Process): 

и реструктурировать свой класс, чтобы переопределить функцию запуска из класса Process. Это решение работало в данном сценарии, вызвав start() из основного

Смежные вопросы