Python中多线程与多进程的两种使用方式有什么区别?

Python 多线程 /进程的两种使用方式:1、初始化类并传入可调用对象; 2、继承类,重载相关方法,这两种方式在使用场景或者其他情况上有什么区别?
Python中多线程与多进程的两种使用方式有什么区别?

8 回复

没有区别


简单说,多线程是“一个院子多个人干活”,多进程是“多个院子各干各的”。

核心区别:

  • 多线程:共享同一个进程的内存空间,适合I/O密集型任务(比如网络请求、文件读写)。Python有GIL锁,CPU密集型任务用多线程基本没提升。
  • 多进程:每个进程有独立内存,通过IPC通信,适合CPU密集型任务,能充分利用多核。

两种使用方式对比:

  1. 直接使用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()
  1. 使用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)

一般你要加入别的属性 /方法的时候用继承的方法,否则能直接实例化干嘛多此一举

回到顶部