多处理池PicklingError

时间:2016-08-10 20:38:47

标签: python multiprocessing

我正在处理一个类,该类可以接收Request类型对象列表并执行请求(使用对象的.execute()API)并返回请求的结果。在尝试进行多重处理时,我遇到了一个问题。我过去使用过Pool,而且我很难在这里工作。当尝试从Pool中运行Executor类中的staticmethod时,我收到PicklingError。但是当直接从新的Process对象运行时,它似乎按预期工作。这种行为的原因是什么?有什么明显的东西我在这里做错了吗?在Python 2.6 btw上运行它

谢谢!

执行者类:

class Executor(object):
    def __init__(self, max_threads):
        self.max_threads = max_threads

    @staticmethod
    def execute_request_partition(requests):
        return [request.execute() for request in requests]

    def execute_requests(self, list_of_requests):
        partitions = split_list(list_of_requests, self.max_threads)
        # Seems to execute as expected
        process = Process(target=self.execute_request_partition, args=(partitions[0],))
        process.run()

        # PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
        p = Pool(1)
        p.apply_async(self.execute_request_partition, args=(partitions[0],))
        p.close()
        p.join()

1 个答案:

答案 0 :(得分:1)

这可以解释您遇到的问题:Can't pickle static method - Multiprocessing - Python

旁注:如果我要花大部分时间等待IO,我就不会使用多处理。尝试线程甚至协同程序(http://www.gevent.org/)。你会得到相同的性能,并且不那么大惊小怪