【问题标题】:python multiprocessing PicklingErrorpython多处理PicklingError
【发布时间】:2015-09-09 21:52:37
【问题描述】:

我正在尝试做一个多用途的 paraloop 类,以便能够轻松地运行多处理器作业。基本上,用户必须在 with 语句中将每个迭代步骤定义为 def 迭代(索引),如本文中的示例所示

这是我的实现

import multiprocessing as mp
import types


class paraloop(object):
    def __init__(self, ncores, niterations):
        self.niterations = niterations
        self.ncores      = min(ncores, self.niterations)

    def __enter__(self, *args, **kwargs):
        self.pool     = mp.Pool(processes = self.ncores)
        self.iterated = 0
        # create results dict
        self.result = {}
        return self

    def __exit__(self, *args, **kwargs):
        print isinstance (iteration, types.MethodType)

        def ITER():
            self.iterated += 1
            self.result[self.iterated] = iteration(self.iterated)
            if self.iterated < self.niterations:
                self.pool.apply_async( ITER ).get()

        print isinstance (ITER, types.MethodType)
        # run iterations in parallel    
        [self.pool.apply_async( ITER ).get() for idx in xrange(self.ncores)]

# usage example
import numpy as np
ITERATIONS = 10
ARRAY = np.ones(1000000)

with paraloop(ncores=4, niterations=ITERATIONS) as p:
    def iteration(index):
        print 'this is an iteration %i'%index
        s = 0
        for n in ARRAY:
            s += n
        return s

打印语句是为了确保我有picklable函数而不是方法。

>> False
>> False
>> Traceback (most recent call last):
>>   File "paraloop.py", line 48, in <module>
>>     def iteration(index):
>>   File "paraloop.py", line 29, in __exit__
>>     [self.pool.apply_async( ITER ).get() for idx in xrange(self.ncores)]
>>   File "c:\Python27\lib\multiprocessing\pool.py", line 558, in get
>>     raise self._value
>> cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

知道为什么我会收到此错误消息吗?

【问题讨论】:

标签: python-2.7 multiprocessing


【解决方案1】:

考虑到一个任意规则,如果你不能导入它,那么你就不能腌制它,因为pickle 会在序列化之前尝试这样做。只是不要在另一个函数中定义目标函数!

【讨论】:

    猜你喜欢
    • 2014-08-13
    • 2014-09-05
    • 1970-01-01
    • 2012-02-06
    • 2011-10-24
    • 2022-08-06
    • 2011-04-20
    • 2016-05-30
    相关资源
    最近更新 更多