Python&多处理,将一组生成分解为子流程

时间:2010-11-24 20:37:34

标签: python list set multiprocessing locks

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

首先,我将第一个字符串列表分解为每个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)

奇怪的是a)主进程上的self.feature_labels为空,但是当从每个子进程调用它时,它有项目。我想我在这里采取了错误的方法(这是我以前用Java做的!)。有更好的方法吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

考虑使用一组工人:http://docs.python.org/dev/library/multiprocessing.html#using-a-pool-of-workers。这为map-reduce风格做了很多工作,并返回了汇编结果。

答案 1 :(得分:1)

使用multiprocessing.Pipe, or Queue(或其他此类对象)在进程之间传递数据。使用Pipe在两个进程之间传递数据,使用Queue来允许多个生产者和使用者。

除官方文档外,Doug Hellman's multiprocessing tutorial还有很好的例子。特别是,它有一个如何使用multiprocessing.Pool来实现mapreduce类型操作的示例。它可能非常适合您的目的。

答案 2 :(得分:0)

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