0

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

首先,我将第一个字符串列表分解为每个 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 中的做法!)。有更好的方法吗?

提前致谢。

4

3 回答 3

2

考虑使用工人池: http: //docs.python.org/dev/library/multiprocessing.html#using-a-pool-of-workers。这以 map-reduce 样式为您完成了很多工作,并返回了组装的结果。

于 2010-11-24T20:56:43.893 回答
1

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

除了官方文档,在Doug Hellman 的多处理教程中还可以找到很好的示例。特别是,它有一个示例说明如何使用它multiprocessing.Pool来实现 mapreduce 类型的操作。它可能非常适合您的目的。

于 2010-11-24T20:51:17.833 回答
0

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

于 2010-11-24T21:53:12.743 回答