macOS下Python多进程Pipe异常:任务未全部执行求助
macOS上Python多进程Pipe搭配Pool的异常问题
在Intel芯片的macOS Monterey系统上,使用Python多进程的Pipe结合Pool时出现异常行为,Python 3.7和3.11版本运行以下代码均出现任务未全部执行的情况:
def _mp_job(nth, child): print("Nth is", nth) if __name__ == "__main__": from multiprocessing import Pool, Pipe, set_start_method, log_to_stderr import logging, time set_start_method("spawn") logger = log_to_stderr() logger.setLevel(logging.DEBUG) with Pool(processes = 10) as mp_pool: jobs = [] for i in range(20): parent, child = Pipe() # child = None r = mp_pool.apply_async(_mp_job, args = (i, child)) jobs.append(r) while jobs: new_jobs = [] for job in jobs: if not job.ready(): new_jobs.append(job) jobs = new_jobs print("%d jobs remaining" % len(jobs)) time.sleep(1)
问题表现
- 程序进入无限循环,持续报告有任务未完成
- 日志显示子进程执行失败:
[DEBUG/SpawnPoolWorker-10] worker got EOFError or OSError -- exiting - 进一步调试发现,子工作进程取出任务反序列化参数时,反序列化Pipe的child连接端会触发
ConnectionRefusedError,导致工作进程崩溃,任务从队列移除但未完成 - 取消注释代码中的
# child = None后,程序运行完全正常 - 进程池数量越多越容易触发:设置2个进程时稳定,4个及以上就会出现问题(本机为6核,核数并非诱因)
疑问
是否存在明显的错误操作?还是这是Python在macOS上的平台特定Bug?
内容的提问来源于stack exchange,提问作者Sam Bayer
相关产品推荐
相关产品推荐

