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

时间:2015-02-26 11:14:19

标签: python multiprocessing python-multiprocessing pathos

我有一些代码用于使用多处理库的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] ....

工人职能如何获得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 个答案:

答案 0 :(得分:0)

这里有一些问题:

  1. 上面的代码有很多错误/拼写错误。

  2. 当您发送mapp.New_PP时,它会复制mapp.New_PP ...因此它不会在实例之间共享access_dict,因为这些实例是在不同的解释器中创建和销毁的在不同的处理器上进行会话。

  3. 以下可能会更清楚地展示......

    >>> 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的{​​{1}}实例中......而且因为mapp不是传递到其他线程和处理器......它被复制了。因此,它确实有效......并且这些行被添加到类的dict的相关副本中......但是当进程/线程完成其工作并将行号传回{{1}时,它们被垃圾收集然后关闭。

    没有"超级简单"现在在mappmap中执行此操作的方法。但是,如果您使用pathosmultiprocessing,则可以执行此操作。

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

    作为ctypes作者,我计划将功能设置为更高级别的内容......但目前还没有时间表。