functools.partial和multiprocessing.Pool.map不兼容吗?

8 投票
2 回答
3630 浏览
提问于 2025-04-16 03:41

我有一段代码,简化后看起来像这样:

run = functools.partial(run, grep=options.grep, print_only=options.print_only, force=options.force)

if not options.single and not options.print_only and options.n > 0:
    pool = multiprocessing.Pool(options.n)
    Map = pool.map
else: Map = map

for f in args:
    with open(f) as fh: Map(run, fh)

try:
    pool.close()
    pool.join()
except NameError: pass

当我在单进程模式下运行它时,一切正常,但在多进程模式下运行时却出现了这样的错误:

TypeError: type 'partial' takes at least one argument

这些错误和很长的调用堆栈信息混在一起,都是通过多进程模块产生的。这是怎么回事呢?

我使用的是Python 2.6.1版本。

2 个回答

0

它的工作原理是这样的:

from multiprocessing.dummy import Pool as ThreadPool

def executeFunction(server,function):
    print "Server: %s and function: %s" % (server,function)


def executeParallel(servers,function, threads=10):
    pool = ThreadPool(threads)
    functionArguments=partial(executeFunction, function=function)
    results = pool.map(functionArguments, servers)
    pool.close()
    pool.join()
    return results

executeParallel(serverList, "Install")
4

谷歌告诉我,这在Python中是一个bug;显然在Py3k中已经修复了。这个问题似乎是因为partial不能被序列化。

有一个解决方法

撰写回答