Python&;多处理,将集合生成分解为子进程

Python&;多处理,将集合生成分解为子进程,python,list,set,multiprocessing,locks,Python,List,Set,Multiprocessing,Locks,我必须根据其他字符串的一些计算生成一组字符串。这需要相当长的时间,我正在一个多处理器/多核服务器上工作,所以我想我可以将这些任务分解成块,并将它们传递给不同的进程 首先,我将第一个字符串列表分成10000个块,将其发送给一个创建一个新集合的进程,然后尝试获取一个锁并将其报告给主进程。但是,我的主进程集是空的 下面是一些代码: def build_feature_labels(self,strings,return_obj,l): feature_labels = set() fo

我必须根据其他字符串的一些计算生成一组字符串。这需要相当长的时间,我正在一个多处理器/多核服务器上工作,所以我想我可以将这些任务分解成块,并将它们传递给不同的进程

首先,我将第一个字符串列表分成10000个块,将其发送给一个创建一个新集合的进程,然后尝试获取一个锁并将其报告给主进程。但是,我的主进程集是空的

下面是一些代码:

def build_feature_labels(self,strings,return_obj,l):
    feature_labels = set()
    for s in strings:
        feature_labels = feature_labels.union(s.get_feature_labels())
    print "method: ", len(feature_labels)
    l.acquire()
    return_obj.return_feature_labels(feature_labels)
    l.release()
    print "Thread Done"

def return_feature_labels(self,labs):
    self.feature_labels = self.feature_labels.union(labs)
    print "length self", len(self.feature_labels)
    print "length labs", len(labs)


current_pos = 0
lock = multiprocessing.Lock()

while current_pos < len(orig_strings):
    while len(multiprocessing.active_children()) > threads:
        print "WHILE: cpu count", str(multiprocessing.cpu_count())
            T.sleep(30)

    print "number of processes", str(len(multiprocessing.active_children()))
    proc = multiprocessing.Process(target=self.build_feature_labels,args=(orig_strings[current_pos:current_pos+self.MAX_ITEMS],self,lock))
    proc.start()
    current_pos = current_pos + self.MAX_ITEMS

    while len(multiprocessing.active_children()) > 0:
        T.sleep(3)


    print len(self.feature_labels)
def build_feature_标签(self、strings、return_obj、l):
要素_标签=集合()
对于字符串中的s:
feature_labels=feature_labels.union(s.get_feature_labels())
打印“方法:”,len(特征标签)
l、 获得
返回对象。返回特征标签(特征标签)
l、 释放()
打印“线程完成”
def返回功能标签(自我、实验室):
self.feature\u labels=self.feature\u labels.union(实验室)
打印“自我长度”,len(自我功能标签)
打印“长度实验室”,len(实验室)
当前位置=0
lock=multiprocessing.lock()
当前位置<长度(原始字符串):
而len(multiprocessing.active_children())>线程:
打印“WHILE:cpu count”,str(multiprocessing.cpu\u count())
睡眠(30)
打印“进程数”,str(len(multiprocessing.active_children()))
proc=multiprocessing.Process(target=self.build\u feature\u标签,args=(原始字符串[当前位置:当前位置+self.MAX\u项],self,锁))
程序启动()
当前位置=当前位置+自最大项目
而len(multiprocessing.active_children())>0:
睡眠(3)
打印透镜(自我功能标签)
奇怪的是a)主进程上的self.feature_标签是空的,但当从每个子进程调用它时,它有项目。我认为我在这里采取了错误的方法(我以前在Java中就是这样做的!)。有更好的方法吗

提前感谢。

使用(或其他类似对象)在进程之间传递数据。使用管道在两个进程之间传递数据,使用队列允许多个生产者和消费者

除了官方文件,还有一些很好的例子。特别是,它有一个如何使用
多处理.Pool
实现mapreduce类型操作的示例。它可能非常适合您的目的。

使用(或其他类似对象)在进程之间传递数据。使用管道在两个进程之间传递数据,使用队列允许多个生产者和消费者


除了官方文件,还有一些很好的例子。特别是,它有一个如何使用
多处理.Pool
实现mapreduce类型操作的示例。它可能非常适合您的目的。

考虑使用一组工作人员:。这在map reduce样式中为您做了大量工作,并返回汇编的结果。

请考虑使用一个工作程序池:。这在map reduce样式中为您做了大量工作,并返回汇编的结果。

为什么它不起作用:多处理使用进程,进程内存不共享。多处理可以为IPC设置共享内存或管道,但必须显式完成。这就是各种建议将数据发送回主机的方式。

为什么它不起作用:多处理使用进程,进程内存不共享。多处理可以为IPC设置共享内存或管道,但必须显式完成。这就是各种建议将数据发送回主机的方式。

对于多处理队列,这是否意味着我要跟踪当前所有队列(在Python列表中?),在每个子进程中执行类似Queue.put(创建的集合)的操作,然后在主进程中,遍历队列列表并调用q.get以获取集合?@Stuart:您可以这样做,不过想想看,Doug Hellman的教程中有一个很好的例子,使用了
多处理.Pool
,我认为这可能更简单。请参阅mapreduce示例:对于多处理队列,这是否意味着我要跟踪当前所有队列(在Python列表中?),在每个子进程中执行类似Queue.put(创建的集合)的操作,然后在主进程中遍历队列列表并调用q.get获取集合?@Stuart:可以这样做,尽管仔细想想,Doug Hellman的教程中有一个很好的例子,使用了
多处理.Pool
,我认为这可能更简单。请参见mapreduce示例: