[英]Working with pathos multiprocessing tool in Python and
我有一些代码用于使用多处理库的pathos扩展来执行某些操作。 我的问题是如何使用更复杂的工作函数 - 在本例中名为New_PP
。 我应该如何格式化thpool行以处理我的worker函数所需的字典以便给出结果。 Python将字典默认为全局变量,但是在worker函数的范围内,我得到了与此字典( access_dict
)无关的错误,因此我如何发送字典或确保它可供我的工作线程使用。
Nchunks = 10
thpool = pathos.multiprocessing.ThreadingPool()
mppool = pathos.multiprocessing.ProcessingPool()
Lchunk = int(len(readinfiles) / Nchunks)
filechunks = chunks(readinfiles, 10)
for fnames in filechunks:
files = (open(name, 'r') for name in fnames)
res = thpool.map(mppool.map, [New_PP]*len(fnames), files)
print res[0][0]
而工人的功能:
def New_PP(line):
split_line = line.rstrip()
if len(split_line) > 1:
access_dict[4] ....
worker函数如何获取access_dict
?
我也尝试将我的函数包装在一个类中,如下所示:
class MAPPP:
def New_PP(self, line):
self.mytype = access_dict
return my_type
def __init__(self, value_dict):
self.access_dict = access_dict
和:
mapp = MAPPP(value_dict)
print mapp.value_dict
res = thpool.map(mppool.map, [mapp.New_PP]*len(fnames), files)
但是我得到了同样的问题。
这里有一些问题:
上面的代码有一堆错误/拼写错误。
当您发送mapp.New_PP
,它会复制mapp.New_PP
...因此它不会在实例之间共享access_dict
,因为这些实例是在不同处理器上的不同解释器会话中创建和销毁的。
也许下面会更清楚地说明一下......
>>> class MAPPP(object):
... access_dict = {}
... def __init__(self, value_dict):
... MAPPP.access_dict.update(value_dict)
... return
... def New_PP(self, line):
... MAPPP.access_dict[line] = len(line)
... return len(line)
...
>>>
>>> mapp = MAPPP({})
>>> mapp.access_dict
{}
>>> import pathos
>>> thpool = pathos.multiprocessing.ThreadingPool()
>>> mppool = pathos.multiprocessing.ProcessingPool()
>>> fnames = ['foo.txt', 'bar.txt']
>>> files = (open(name, 'r') for name in fnames)
>>> res = thpool.map(mppool.map, [mapp.New_PP]*len(fnames), files)
>>> res
[[21, 21, 21, 21, 21, 21, 20, 21, 19], [17, 18, 17, 17, 50, 82, 98]]
>>> mapp.access_dict
{}
所以发生了什么事? 逐行读取文件......计算每行的长度......并返回主进程。 然而,线路和长度的写入未添加到实例mapp.access_dict
属于mapp
的主要工序......那是因为mapp
不传递给其他线程和处理器...它被复制。 因此,它确实有效......并且这些行被添加到类的dict的相关副本中...但是当进程/线程完成其工作并将行号传回map
然后关闭时,它们被垃圾收集。
现在,在pathos
或多multiprocessing
没有“超级简单”的方法。 但是,如果使用multiprocessing
和ctypes
,则可以执行此操作。
您可能希望查看使用共享内存和/或代理的multiprocessing
:
作为pathos
作者,我打算使功能pathos
......但目前还没有时间表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.