使用BoundedSemaphore限制ProcessPoolExecutor队列时的pickle错误排查
问题原因分析
进程池的序列化特性限制
ProcessPoolExecutor 基于多进程架构,提交的任务(包括函数/方法及关联对象)必须能被pickle序列化后传递给子进程执行。而 ThreadPoolExecutor 是多线程模式,线程共享同一进程的内存空间,无需序列化传递对象,因此不会出现此类问题。实例方法携带不可序列化的锁对象
你提交的self.testfn是test类的实例方法,它会隐式携带整个test实例的引用。而test实例中包含MaxQueuePool对象,该对象内部的pool_queue是threading.BoundedSemaphore——这个类内部依赖了无法被 pickle 序列化的_thread.lock原生锁对象。当进程池尝试序列化testfn对应的实例时,会递归尝试序列化这个锁对象,最终触发TypeError: cannot pickle '_thread.lock' object错误。与原示例的核心差异
原示例中提交的是独立函数,不会携带包含锁对象的实例引用,因此不会触发序列化问题。你的代码改用实例方法作为任务,才引入了这个报错,并非concurrent.futures实现变更导致。
内容的提问来源于stack exchange,提问作者markusyeo
相关产品推荐
相关产品推荐

