Создание дочернего процесса в конструкторе

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

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()

Эта функция называется формой main, как это

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

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

'data reader constructor' 

не печатается и управление не возвращается родителю.

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

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


person Muhammad Umar Farooq    schedule 30.03.2015    source источник


Ответы (1)


Я унаследовал свой data_reader от Process как

class data_reader(multiprocessing.Process):

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

person Muhammad Umar Farooq    schedule 01.04.2015