python 文件本身不会自动创建多个线程,
但如果代码或依赖的库用了多线程/多进程机制,它就会在运行时自动创建多个线程。
一、正常情况下(没有主动开线程)
def foo():
print("hello")
foo()
或者即使是比较复杂的逻辑,比如深度学习推理、图像处理、文件读写,
只要没有显式地使用线程或异步,
程序只运行在一个主线程(mainthread)里。
此时 vs code 的调用堆栈中只会看到:
mainthread
二、为什么很多程序会“自动”出现多个线程
很多人第一次调试时会惊讶地看到几十个线程,其实大多数不是显式创建的,而是:
| 来源 | 举例 | 说明 |
|---|---|---|
| python 内部运行时 | threadpoolexecutor, asyncio, multiprocessing | 例如 threadpoolexecutor(max_workers=4) 会开 4 个线程去执行任务。 |
| 第三方库自动创建 | opencv, pytorch, tensorflow, numpy, requests 等 | 为了提升性能,这些库常在底层开线程。例如 pytorch 的算子调用 blas/openmp 会自动并行计算。 |
| jupyter / vscode 调试器自身 | 调试器、控制台 i/o | vs code 在调试时也会创建辅助线程用于通信、变量同步、断点管理。 |
| gpu 或底层加速库 | cudnn、mkl、openblas | 这些都是多线程实现的,python 只是在上层调用它们。 |
所以:写的 python 文件是“单线程逻辑”,
但执行时 python 解释器 + 底层库 会自动生成多个辅助线程。
三、怎么判断线程是谁创建的?
在调试器中点开线程名称可以看到调用堆栈。
比如:
threadpoolexecutor-1_0 -> torch/threadpool.py -> ...
或
thread-208679 -> site-packages/opencv/...
从路径就能看出是哪个库开的线程。
四、手动创建线程的常见方式
如果自己在代码里写了这些,那是主动多线程:
import threading
def worker(i):
print(f"thread {i} running")
for i in range(5):
t = threading.thread(target=worker, args=(i,))
t.start()
这时会在 vs code 调试器里看到:
mainthread thread-1 thread-2 thread-3 ...
五、总结
| 情况 | 是否会自动创建多线程 | 说明 |
|---|---|---|
| 普通 python 脚本 | ❌ 否 | 只有主线程 |
| 使用线程池、异步库 | ✅ 会 | 用户代码开线程 |
| 使用深度学习 / opencv / numpy 等库 | ✅ 会 | 底层自动并行 |
| vs code 调试模式 | ✅ 会 | 调试器自己也会开辅助线程 |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论