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

Python使用concurrent.futures提交任务运行一段时间后变慢且CPU负载高如何解决

代码问题根因
  • 锁用错了:你用的threading.Lock是线程间同步锁,仅在同一个进程内的多个线程之间生效。而你用的是ProcessPoolExecutor多进程池,不同进程的地址空间完全隔离,每个子进程拿到的lock都是独立副本,完全起不到跨进程同步写文件的作用,甚至还可能因为多进程同时写文件导致CSV内容错乱。
  • 忙等待空耗CPU:代码里的while lock.locked(): continue是完全多余的忙等逻辑,锁被占有时,进程会在这个循环里不断空跑判断锁状态,直接把CPU资源占满,留给find_delta计算任务的CPU资源越来越少,自然就会出现运行到后期速度骤降、CPU负载极高的现象。本身lock.acquire()就自带阻塞等待逻辑,不需要你自己写循环判断锁状态。
基于concurrent.futures的解决方案

最优方案是把计算逻辑和写文件逻辑拆分,子进程只负责CPU密集的计算任务,写文件操作统一放到主进程单线程执行,完全不需要跨进程锁,也不会有空耗问题:

改造后的代码

import concurrent.futures
import os

# 子进程仅做计算,返回结果即可,不需要加锁、写文件
def do_the_work(item):
    t1, t2 = find_delta(item[1]['file1'], item[1]['file2'])
    return (t1, t2)

with concurrent.futures.ProcessPoolExecutor(max_workers=os.cpu_count()) as executor:
    futures = [executor.submit(do_the_work, item) for item in work_list.items()]
    # 主进程逐个接收计算完成的结果,单线程写CSV,不需要锁
    for future in concurrent.futures.as_completed(futures):
        datapoint = future.result()
        writer.writerow(datapoint)
        print('Done writing to csv')

改造后优势

  • 所有写文件操作都在主进程单线程执行,不会出现多进程写冲突,完全不需要同步锁
  • 子进程没有任何忙等待逻辑,CPU资源全部用于find_delta计算任务,不会出现后期速度下降的问题
  • 完全基于concurrent.futures原生API实现,不需要额外引入队列等组件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:06:00