You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

multiprocessing Worker代码未执行,如何让Worker正常运行?

Python多进程Worker函数未执行的解决方法

问题分析

你的代码主进程能正常打印In main,但子进程的worker函数无输出,通常是输出缓冲未刷新、进程池操作顺序错误或Worker执行异常导致的。

具体修复方案

1. 修正进程池操作顺序

进程池的正确操作逻辑是先关闭(禁止提交新任务),再等待所有子进程完成。原代码中join()在close()之前的顺序错误,修正后:

def worker(data_row):
    print("In worker", data_row, flush=True)  # 强制刷新输出缓冲

if __name__ == '__main__':
    db_conn = init_db_conn()
    query = "SELECT * FROM your_target_table"  # 确保query变量已定义
    rows = db_conn.execute(query).fetchall()
    
    db_conn.close()

    pool = Pool(4)
    jobs = []
    for row in rows:
        print("In main", row)
        job = pool.apply_async(worker, (row,))
        jobs.append(job)

    pool.close()  # 先关闭进程池,不再接受新任务
    pool.join()   # 等待所有子进程执行完成

2. 强制刷新输出缓冲

子进程的print输出默认会被系统缓冲,无法实时显示到控制台。在print语句中添加flush=True即可强制刷新:

def worker(data_row):
    print("In worker", data_row, flush=True)

也可以在程序开头全局设置无缓冲输出:

import sys
sys.stdout = open(sys.stdout.fileno(), 'w', buffering=1)

3. 捕获Worker执行异常

如果worker函数执行时抛出异常,任务会静默失败且无输出。可以在获取任务结果时捕获异常,排查具体问题:

for job in jobs:
    try:
        job.get()
    except Exception as e:
        print(f"Worker执行出错: {str(e)}")

4. 确认依赖项已正确定义

确保init_db_conn()函数和query变量已在代码中正确实现,避免主进程在获取数据阶段出错,导致没有任务提交给子进程。

内容的提问来源于stack exchange,提问作者SwiftMango

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:44:54