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
相关产品推荐
相关产品推荐

