繁体   English   中英

使用pickle,kwargs和函数引用进行Python多重处理

[英]Python multiprocessing using pickle, kwargs, and function references

我遇到的情况是在python中使用任何有效的多处理框架都遇到问题(无论是独家还是多处理)。

我有以下情况:

  1. 具有功能“ f”的一类“ Foo”
  2. 第二个“ Bar”类,它获取参数(kwargs)并保存“ Foo”类的实例(包含函数)
  3. 在“ Bar”中,使用给定的参数执行Foo类的功能。
  4. 由于统计意义,结果是多次运行的平均值,在这种情况下为10次(在给定示例中未显示)。

这是示例:

import multiprocessing as mp

class Foo:
    def __init__(self, f):
        self.f = f

class Bar:
    def __init__(self, foo, **kwargs):
        self.args = kwargs
        self.foo = foo

    def execute(self):
        pool = mp.Pool(5)
        f = lambda x : self.foo.f(**x)
        args = [self.args] * 10
        results = pool.map(f, args)

if __name__ == '__main__':
    def anything(**kwargs):
        print(kwargs['z'])
        return kwargs['x'] * kwargs['y']
    foo = Foo(anything)
    args = {'x':10, 'y':27, 'z':'Hello'}
    bar = Bar(**args)

我知道功能必须在模块级别才能被选择。 有什么方法可以使函数可选取吗? 不幸的是,我对Python OOP的经验不是很丰富,所以可能我错过了重要的一点! 谢谢!

编辑:不幸的是,即使使用使用莳萝代替泡菜的模块“ multiprocess”(感谢Mike McKerns),也不能保证我的问题得到了解决。 对于我的程序的一些短期运行,一切都很好。 由于某些原因,当我遇到以下错误时,多进程似乎会生成竞争条件:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/local/lib/python2.7/dist-packages/multiprocess/pool.py", line 389, in _handle_results
    task = get()
  File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 209, in loads
    return load(file)
  File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 199, in load
    obj = pik.load()
  File "/usr/lib/python2.7/pickle.py", line 864, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1096, in load_global
    klass = self.find_class(module, name)
  File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 353, in find_class
    return StockUnpickler.find_class(self, module, name)
  File "/usr/lib/python2.7/pickle.py", line 1132, in find_class
    klass = getattr(mod, name)
AttributeError: 'module' object has no attribute 'Individual'

(个人是我的程序[使用deap的遗传算法]使用的类)。

(重复以上评论)

替代multiprocessmultiprocessing和代码应该没有其他的变化工作。 这是因为multiprocess是一个叉multiprocessing使用dill ,而不是pickle ...所以你能够在序列几乎蟒任何东西,包括你的解释器会话写的东西。 这是对multiprocessing的分支所做的唯一更改。

参见https://stackoverflow.com/a/21345273/2379433https://stackoverflow.com/a/21345308/2379433https://stackoverflow.com/a/21345423/2379433等。

暂无
暂无

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

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