У меня есть класс, который создает новый процесс в конструкторе, как показано нижесоздание дочернего процесса в конструкторе
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. Я думаю использовать программирование сокетов, чтобы избежать этого сценария.