Python中多线程与多进程如何选择?
萌新请教:需要几个程序对数据库进行操作,但是这几个程序并没有啥共享变量啥的,都是独立的。开始想多线程编程就写一个 py 文件来运行就可以了;但是想到也可以一个程序一个 py 文件,就是要多 python xxx.py 几次(主要是因为我还没学 python 的多线程编程这块-。-)
请问这两个方法有什么优劣吗?
Python中多线程与多进程如何选择?
核心就一句话:计算密集型用多进程,I/O密集型用多线程。
为什么? Python有个全局解释器锁(GIL),它让一个进程里同一时刻只有一个线程能执行Python字节码。所以,如果你开多线程做纯计算(比如算圆周率),它们实际上是在“轮流”执行,没法真正利用多核CPU,速度可能比单线程还慢。
多进程绕过了GIL,每个进程有自己的Python解释器和内存空间,能真正并行跑在多核上。但进程创建开销大,内存不共享,通信(用Queue、Pipe等)也比线程麻烦。
多线程虽然被GIL限制,但在做I/O操作(网络请求、读写文件、数据库查询)时,线程在等待I/O时会释放GIL,其他线程就能接着跑。这样在I/O等待多的时候,多线程效率很高,而且共享内存,写起来简单。
简单总结:
- 多进程:对付CPU重的活儿,比如数据分析、图像处理、科学计算。
- 多线程:对付I/O重的活儿,比如爬虫、Web服务器处理请求、文件批量处理。
代码看一眼就明白:
import threading
import multiprocessing
import time
# 1. 计算密集型任务 - 用多进程
def compute_intensive(n):
total = 0
for i in range(n):
total += i * i
return total
def test_compute():
# 多线程 (受GIL限制)
start = time.time()
threads = [threading.Thread(target=compute_intensive, args=(10000000,)) for _ in range(4)]
for t in threads:
t.start()
for t in threads:
t.join()
print(f"多线程计算耗时: {time.time() - start:.2f}秒")
# 多进程 (真正并行)
start = time.time()
processes = [multiprocessing.Process(target=compute_intensive, args=(10000000,)) for _ in range(4)]
for p in processes:
p.start()
for p in processes:
p.join()
print(f"多进程计算耗时: {time.time() - start:.2f}秒")
# 2. I/O密集型任务 - 用多线程
def io_intensive(seconds):
time.sleep(seconds) # 模拟I/O等待
def test_io():
# 多线程 (I/O时释放GIL)
start = time.time()
threads = [threading.Thread(target=io_intensive, args=(1,)) for _ in range(10)]
for t in threads:
t.start()
for t in threads:
t.join()
print(f"多线程I/O耗时: {time.time() - start:.2f}秒")
# 多进程 (开销大)
start = time.time()
processes = [multiprocessing.Process(target=io_intensive, args=(1,)) for _ in range(10)]
for p in processes:
p.start()
for p in processes:
p.join()
print(f"多进程I/O耗时: {time.time() - start:.2f}秒")
if __name__ == "__main__":
print("=== 计算密集型测试 ===")
test_compute()
print("\n=== I/O密集型测试 ===")
test_io()
跑一下上面代码,你会看到:
- 计算任务:多进程明显比多线程快。
- I/O任务:多线程和多进程时间差不多,但多线程创建开销小得多。
现在选起来很简单: 先看你的任务是CPU瓶颈还是I/O瓶颈,然后对照上面规则选。如果拿不准,写个小样测试一下最靠谱。
总结:CPU用进程,I/O用线程。
你的问题好混乱啊,Python 的话,优先选择多进程吧。
如果是要利用 cpu,的所有资源,可用多进程。 看延迟用在哪里了 ,如果是网络 /io 之类的 gevent 就能帮助你。 先学习学习
Python 的话,优先选择多进程吧
python 一般会有 GIL,如果是 io 多的多线程也可以,一般是多进程
- 题目描述有问题,啥叫单线程多个进程?我的理解就是:用多线程还是多进程
2. 你启动多进程的方法…不方便而且不太好。应该使用标准库 mutilprocess
3. 这两个方法优劣。很简单,你两个方法都写出来,做个测试不就好了。重效率,你就比较执行时间。
一些拙见:数据库操作属于 io 任务。所以多线程是可以的。不过你得注意,如果你是一个线程一个连接,最好有连接池;如果共享一个连接,那你得加锁,同时创建连接的时候把 check_same_thread 设为 False
如果有这个或者类似的检查设置的话
异步算了
我没说清-。- 意思就是一个进程只有一个线程,开多个进程
进程面临的问题,进程间通信,同步,创建代价稍高。线程面临问题,数据竞争,多线程的各种坑,还有 GIL。
实际上在 Linux 系统上,线程就是个特殊的进程,和父进程共享数据空间,getpid 返回主线程的 tid,主线程的 tid 就是其 pid,使用 syscall(SYS_GETTID) 就可以知道 。fork pthread_create 一般都是使用 syscall SYS_CLONE.
以数据库的并发能力,你的需求一个线程或进程就够了 - - ,弄什么多线程多进程。。。
补充一下用简单的 ORM 甚至简单的 jdbc 类似的库就够了。 上框架之前先看自己需求以及当前的服务并发处理能力,自己估算一下。 当然如果是学习,什么框架都可以了🤪
我觉着 可以用用 GO
python 是推崇多进程的,毕竟多线程有 GIL 锁。因此 python 也提供了很多跨进程通讯的数据结构,基本可以满足跨进程传输需求。
用 python 就不要太考虑并发能力了。
看场景啊
要用什么方法,主要还是以需求为导向的。
我觉得如果是简单的多任务并发,协程应该是最好的选择。
python 线程在 cpu 计算类型没用,在 io 计算是有用的。如果是操作数据库,建议多线程
操作数据库是网络 io 密集型,建议用协程

