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 调试模式 ✅ 会 调试器自己也会开辅助线程 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Python多线程实现大文件快速下载的代码实现 Python多线程如何同时处理多个文件 python logging多进程多线程输出到同一个日志文件的实战案例 linux 下python多线程递归复制文件夹及文件夹中的文件 python多线程案例之多任务copy文件完整实例 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/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 调试模式 ✅ 会 调试器自己也会开辅助线程

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

    您可能感兴趣的文章:

    • Python多线程实现大文件快速下载的代码实现
    • Python多线程如何同时处理多个文件
    • python logging多进程多线程输出到同一个日志文件的实战案例
    • linux 下python多线程递归复制文件夹及文件夹中的文件
    • python多线程案例之多任务copy文件完整实例
    • python多线程分块读取文件
    • python多线程同步之文件读写控制

    站内搜索