我正在处理一个类,该类可以接收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()
答案 0 :(得分:1)
这可以解释您遇到的问题:Can't pickle static method - Multiprocessing - Python
旁注:如果我要花大部分时间等待IO,我就不会使用多处理。尝试线程甚至协同程序(http://www.gevent.org/)。你会得到相同的性能,并且不那么大惊小怪