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

