为什么Python中ProcessPoolExecutor调用内部函数时无输出不执行
问题解答
核心原因
你修改后的代码无输出、不报错是两个机制共同作用的结果:
嵌套函数无法被多进程序列化
Python的ProcessPoolExecutor传递任务到子进程时,需要通过pickle模块序列化要执行的函数和参数。你将is_even定义为main函数内部的局部函数,而pickle不支持序列化这类嵌套在其他函数里的内部函数,子进程无法还原执行该函数,因此任务没有正常运行。
你第一段代码的is_even是模块顶层函数,符合pickle序列化要求,所以可以正常执行。未迭代
map返回的迭代器导致异常被静默executor.map返回的是惰性迭代器,只有主动遍历这个迭代器时,主进程才会等待子进程执行完毕、并抛出子进程运行过程中产生的异常。你的代码仅对map返回结果做了赋值,没有遍历操作,因此序列化失败的异常不会被触发,看起来就像无输出也无报错。
你可以在executor.map代码后加一行list(result),就能看到对应的序列化错误提示。
修复方案
把is_even函数移到模块顶层作用域即可正常运行,参考代码如下:
import concurrent.futures NUMBERS = [1, 2, 3, 4, 5, 6, 7, 8] def is_even(n): if n % 2 == 0: print(n, " is even number") else: print(n, " is not even number") def main(): with concurrent.futures.ProcessPoolExecutor() as executor: result = executor.map(is_even, NUMBERS) # 遍历迭代器等待所有任务执行完成 list(result) if __name__ == '__main__': main()
如果你不想把函数提到顶层,也可以换成ThreadPoolExecutor,线程池不需要跨进程序列化函数,支持直接使用嵌套函数。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

