繁体   English   中英

在Python和Python中使用pathos多处理工具

[英]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)

但是我得到了同样的问题。

这里有一些问题:

  1. 上面的代码有一堆错误/拼写错误。

  2. 当您发送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没有“超级简单”的方法。 但是,如果使用multiprocessingctypes ,则可以执行此操作。

您可能希望查看使用共享内存和/或代理的multiprocessing

作为pathos作者,我打算使功能pathos ......但目前还没有时间表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM