构造函数中的子进程创建

时间:2015-03-30 10:34:22

标签: python multiprocessing python-multiprocessing

我有一个在构造函数中创建新进程的类,如下所示

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)

现在在正常情况下,每当我运行此代码时,它都可以正常工作,并且子对象在对象被销毁时终止。当我将这个main作为来自另一个程序(spearmint https://github.com/JasperSnoek/spearmint)的子进程运行时,问题就来了。对构造函数的调用永远不会返回,但会创建一个新子节点。在其他情况下,孩子被创建但是

的消息
'data reader constructor' 

未打印,控件未返回父级。

是否有一些我无法理解的限制。

PS。我正在考虑使用套接字编程来避免这种情况。

1 个答案:

答案 0 :(得分:0)

我从Process继承了我的data_reader

class data_reader(multiprocessing.Process):

并重构我的类以覆盖Process类的run函数。此解决方案通过从main

调用start()在给定方案中工作