我必须根据其他字符串的一些计算生成一组字符串。这需要一段时间,我正在研究多处理器/多核服务器,所以我想我可以将这些任务分解成块并将它们传递给不同的进程。
首先,我将第一个字符串列表分解为每个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做的!)。有更好的方法吗?
提前致谢。
答案 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设置共享内存或管道,但必须明确地完成。这就是各种建议将数据发送回主数据库的方式。