构造函数中的子进程创建



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

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()来工作

最新更新