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

Python多线程:如何让耗时程序利用多核CPU启用多线程运行

为什么你的Python程序只占单个线程?

这是CPython的**全局解释器锁(GIL)**导致的——同一时间只有一个线程能执行Python字节码,所以CPU密集型任务用多线程根本没法利用多核,反而会因为线程切换增加额外开销。但如果是IO密集型任务(比如网络请求、文件读写),多线程就能发挥作用,因为线程在等待IO时会主动释放GIL,让其他线程运行。

针对不同场景的解决方案

1. CPU密集型任务:用多进程(真正利用多核)

每个Python进程都有独立的GIL,所以多进程可以让多个核同时工作。直接用标准库的multiprocessing就能实现,比如把你的耗时函数拆分成多个独立的子任务,分配给不同进程:

def heavy_calc(num):
    # 模拟你的耗时计算逻辑
    res = 0
    for i in range(num):
        res += i ** 3
    return res

if __name__ == "__main__":
    # 拆分数据集,对应你的多核数量(比如4核就拆4份)
    tasks = [10**7, 10**7, 10**7, 10**7]
    
    from multiprocessing import Pool
    # 进程数设为CPU核心数,也可以手动指定
    with Pool(processes=4) as pool:
        results = pool.map(heavy_calc, tasks)
    
    print("计算结果:", results)

注意:Windows系统下必须加if __name__ == "__main__",否则会重复启动子进程导致报错。

2. IO密集型任务:用多线程或异步

如果你的程序大部分时间在等IO(比如爬网页、读数据库),多线程就能显著提升效率。用concurrent.futures.ThreadPoolExecutor比直接用threading更简洁:

import requests
from concurrent.futures import ThreadPoolExecutor

def fetch_page(url):
    resp = requests.get(url)
    return url, resp.status_code

if __name__ == "__main__":
    urls = [
        "https://example.com",
        "https://google.com",
        "https://github.com"
    ]
    
    with ThreadPoolExecutor(max_workers=3) as executor:
        # 批量提交任务并获取结果
        results = list(executor.map(fetch_page, urls))
    
    for url, status in results:
        print(f"{url} 状态码:{status}")

3. 你搜到的“函数处理不同数据集”的方法

这其实就是并行化的核心思路——任务拆分。只要你的耗时逻辑可以拆成多个互不依赖的子任务(每个子任务处理一部分数据集),这种方法就完全适用,而且是最直接有效的并行方案。你可以直接根据自己的任务类型,选择用多进程(CPU密集)或多线程(IO密集)来实现。

额外注意点
  • 进程间通信有开销,所以子任务不能太小,否则开销会抵消并行的收益。
  • 如果需要共享数据,多进程要用multiprocessing.Queue、Manager等工具;多线程则需要加锁(比如threading.Lock)避免竞态条件。
  • 极端CPU密集场景,也可以试试PyPy(无GIL的Python实现)或者用Cython写核心计算逻辑,进一步提升效率。

内容的提问来源于stack exchange,提问作者Péter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:20:53