python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python文件多线程/多进程机制

Python文件多线程/多进程机制详解

作者:年六季

文章主要介绍了Python程序在运行时可能会自动创建多个线程的情况,包括Python内部的线程池、异步库、第三方库以及调试器自身的线程,文章还提供了判断线程来源的方法,并总结了手动创建线程的常见方式

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/OVS 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 调试模式✅ 会调试器自己也会开辅助线程

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文