我有一个类,它在构造函数中创建了一个新进程,如下所示
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()
这个函数和一样被称为form main
data_train = data_reader(train_paths_list)
data_valid = data_reader(valid_paths_list)
data_test = data_reader(test_paths_list)
现在,在正常情况下,每当我运行这段代码时,它都能正常工作,并且随着对象的销毁,子进程也会终止。当我将这个main作为另一个程序(留兰香)的子进程运行时,问题就来了https://github.com/JasperSnoek/spearmint)。对构造函数的调用永远不会返回,但会创建一个新的子级。在其他情况下,创建子项,但的消息
'data reader constructor'
未打印,并且控件未返回给父级。
是不是有一些我无法理解的局限性。
PS。我正在考虑使用套接字编程来避免这种情况。
我从Process继承了我的data_reader作为
class data_reader(multiprocessing.Process):
并重构了我的类以覆盖Process类中的run函数。该解决方案在给定的场景中通过从主调用start()来工作