Python中多线程与多进程的两种使用方式有什么区别?
Python 多线程 /进程的两种使用方式:1、初始化类并传入可调用对象; 2、继承类,重载相关方法,这两种方式在使用场景或者其他情况上有什么区别?
Python中多线程与多进程的两种使用方式有什么区别?
8 回复
没有区别
简单说,多线程是“一个院子多个人干活”,多进程是“多个院子各干各的”。
核心区别:
- 多线程:共享同一个进程的内存空间,适合I/O密集型任务(比如网络请求、文件读写)。Python有GIL锁,CPU密集型任务用多线程基本没提升。
- 多进程:每个进程有独立内存,通过IPC通信,适合CPU密集型任务,能充分利用多核。
两种使用方式对比:
- 直接使用
threading/multiprocessing模块:
import threading
import multiprocessing
# 多线程示例
def thread_task():
print(f"Thread {threading.current_thread().name}")
threads = [threading.Thread(target=thread_task) for _ in range(3)]
for t in threads:
t.start()
for t in threads:
t.join()
# 多进程示例
def process_task():
print(f"Process {multiprocessing.current_process().name}")
processes = [multiprocessing.Process(target=process_task) for _ in range(3)]
for p in processes:
p.start()
for p in processes:
p.join()
- 使用
concurrent.futures高级API:
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
def task(n):
time.sleep(0.5)
return n * n
# 线程池 - I/O密集型
with ThreadPoolExecutor(max_workers=3) as executor:
results = list(executor.map(task, range(5)))
print(f"Thread results: {results}")
# 进程池 - CPU密集型
with ProcessPoolExecutor(max_workers=3) as executor:
results = list(executor.map(task, range(5)))
print(f"Process results: {results}")
怎么选:
- I/O密集型(网络、磁盘操作)→ 用多线程或
ThreadPoolExecutor - CPU密集型(计算、数据处理)→ 用多进程或
ProcessPoolExecutor - 简单任务用直接模块,复杂任务用
concurrent.futures更简洁
一句话建议:根据任务类型选对并发方式,别让GIL拖慢你的CPU任务。
推荐多进程 GIL 是个坑
都不用,
用 celery
IO 密集型的情况下,多线程基本不受 GIL 影响
区别就是原始的run()的行为是调用target(*args, **kwargs)。
一般你要加入别的属性 /方法的时候用继承的方法,否则能直接实例化干嘛多此一举

