为什么我不能在类方法中使用python模块concurrent.futures?

时间:2013-07-02 07:29:15

标签: python class parallel-processing class-method concurrent.futures

我想让我的类方法并行运行,但它只会产生一些我无法解决的错误。 我的代码是:

import concurrent.futures as futures

samples = ['asfd', 'zxcv', 'asf', 'qwer']

class test:
    def __init__(self, samples):
        maturedb = {}
        with futures.ProcessPoolExecutor() as exe:
            for samplename, dResult in exe.map(self.make_readdb, samples):
                maturedb[samplename] = dResult
        print(maturedb)

    def make_readdb(self, samplename):
        return samplename, 1

test(samples)

如果我在Ubuntu机器上运行此代码,则会发生如下错误:

Traceback (most recent call last):
    File "/usr/lib/python3.2/multiprocessing/queues.py", line 272, in _feedsend(obj)
    _pickle.PicklingError: Can't pickle <class 'method'>: attribute lookup builtins.method failed

方法make_readdb只是简化了一个例子,但它是实际代码中的瓶颈 我需要让它平行。请帮忙。

1 个答案:

答案 0 :(得分:2)

来自docs

  

ProcessPoolExecutor类是使用池的Executor子类   进程异步执行调用。 ProcessPoolExecutor使用   多处理模块,允许它侧向全局   解释器锁也意味着只有可选择的对象可以   执行并返回。

尝试ThreadPoolExecutor

<强>更新

我再次查看了您的代码,问题是函数 - make_readdb - 是类test的成员。你可以重构并拉出这个功能吗?