Python 多线程、多进程 vs C++ 多线程、多进程

📅 2026/6/30 6:43:07
Python 多线程、多进程 vs C++ 多线程、多进程
一、基础核心概念通用定义1. 进程 Process操作系统资源分配最小单位独立内存空间、文件句柄、CPU 上下文、堆 / 栈进程间天然隔离互不干扰创建销毁开销大切换成本高。2. 线程 Thread进程内调度最小单位共享所属进程的内存、全局变量、文件描述符仅私有栈、寄存器切换轻量、开销小同一进程线程数据共享存在竞态条件需要同步锁。3. 关键区分多线程同一进程内并发共享资源多进程多个独立进程资源隔离靠 IPC 通信。二、Python 多线程 多进程 核心实现与原理一Python 多线程threading 模块核心限制GIL 全局解释器锁Python 最关键特性CPython 解释器存在GIL同一时刻一个进程内只有一条线程能执行 Python 字节码。CPU 密集场景多线程几乎无法多核并行只能交替并发速度不如单线程IO 密集场景网络、文件、sleep、数据库线程阻塞时会释放 GIL多线程可大幅提升效率。1. 核心 APIimport threading import time def task(name): print(f线程{name}启动) time.sleep(1) # IO阻塞释放GIL print(f线程{name}结束) if __name__ __main__: t1 threading.Thread(targettask, args(A,)) t2 threading.Thread(targettask, args(B,)) t1.start() t2.start() t1.join() t2.join()2. 同步工具解决共享变量竞争threading.Lock/RLock/Semaphore/Condition/Event3. 线程池concurrent.futures.ThreadPoolExecutor简化批量线程管理自动复用线程不用手动创建销毁。Python 线程特点总结共享进程堆、全局变量通信简单直接读写变量配合锁GIL 锁死多核 CPU 并行不适合计算密集型任务轻量、创建快IO 场景首选异常、死锁问题和 C 线程同源。二Python 多进程multiprocessing 模块核心原理绕开 GIL每个子进程拥有独立 Python 解释器 独立 GIL天然支持多核 CPU 并行计算。 操作系统层面调用fork()(Linux/macOS) / 创建全新进程 (Windows)每个进程拥有独立内存拷贝进程间数据默认隔离。1. 核心 APIfrom multiprocessing import Process def task(name): print(f进程{name}执行PID:{os.getpid()}) if __name__ __main__: p1 Process(targettask, args(P1,)) p2 Process(targettask, args(P2,)) p1.start() p2.start() p1.join() p2.join()2. 进程间通信 IPC无法直接共享变量Queue安全消息队列Pipe双端管道Manager共享容器 (list/dict)底层走 IPCValue/Array共享内存基础数值。3. 进程池ProcessPoolExecutor批量调度多进程适合大规模 CPU 计算。Python 多进程特点多核并行完美适配数值计算、AI 训练、数据处理进程内存完全拷贝创建 / 切换开销远大于线程进程隔离一个进程崩溃不会带走主程序Windows 必须写if __name__ __main__防无限递归创建进程IPC 通信有性能损耗频繁数据交互不推荐。Python 线程 / 进程选型总结IO 密集爬虫、文件读写、接口请求threading多线程CPU 密集矩阵运算、循环计算multiprocessing多进程三、C 多线程 多进程 核心实现与原理一C 多线程C11 标准库thread核心特点无 GIL原生操作系统线程封装C 线程直接映射 OS 内核线程无全局锁限制同一进程多线程可充分利用多核 CPU 并行。1. 基础示例cpp运行#include thread #include iostream #include chrono void task(std::string name) { std::cout 线程 name 运行\n; std::this_thread::sleep_for(std::chrono::seconds(1)); } int main() { std::thread t1(task, A); std::thread t2(task, B); t1.join(); t2.join(); return 0; }2. 同步互斥工具mutexstd::mutex、std::recursive_mutex、std::lock_guard、std::unique_lock条件变量std::condition_variable信号量 (C20)std::semaphore原子操作std::atomicT无锁并发。3. 线程池C 标准无内置线程池需自行封装或使用第三方库Boost、Abseil。C 线程核心特性无 GIL多核并行计算性能极强共享进程地址空间全局变量、堆内存全部共享极易数据竞争手动管理资源忘记join()会触发程序崩溃terminate内存模型C 内存序memory_order精细控制 CPU 缓存可见性开销极低调度完全由操作系统负责。二C 多进程无标准跨平台库依赖系统 APIC 标准库没有封装进程必须调用操作系统原生接口Linux/macOSPOSIX APIfork()、exec()WindowsWin32 APICreateProcess1. Linux fork 原理fork()调用后复制父进程完整内存写时复制 COW返回两次父进程返回子进程 PID子进程返回 0 父子进程内存独立仅文件描述符默认继承。Linux 简单示例cpp运行#include unistd.h #include iostream #include sys/wait.h int main() { pid_t pid fork(); if (pid 0) { // 子进程 std::cout 子进程 PID: getpid() \n; } else if (pid 0) { // 父进程等待子进程结束 wait(nullptr); std::cout 父进程等待子进程完成\n; } return 0; }2. C 进程间通信 IPC跨进程数据交换Linux管道 pipe、命名管道 FIFO、共享内存 shmget、消息队列、Socket、信号 signal Windows匿名管道、命名管道、内存映射文件C 多进程特点完全内存隔离单个进程崩溃不影响其他进程创建销毁开销巨大内存拷贝成本高无统一标准 APILinux 与 Windows 代码完全不兼容IPC 通信繁琐需要手动管理句柄、同步多用于服务隔离、故障容灾场景。C 线程 / 进程选型总结CPU 密集计算、低延迟并发std::thread多线程多核并行无锁限制服务隔离、独立故障域、权限隔离多进程 (fork/CreateProcess)四、Python 与 C 并发核心差异总表表格维度Pythonthreading/multiprocessingCstd::thread / OS 进程 API多线程多核并行受 GIL 限制CPU 密集无法多核并行无全局锁原生多核并行线程资源开销轻量但 GIL 限制算力极轻量调度效率高多进程实现标准库 multiprocessing 跨平台封装无标准库依赖系统原生 API进程内存模型子进程完整拷贝Manager 提供共享容器fork 写时复制 / Windows 全新内存手动共享内存线程数据共享直接共享全局变量依赖 Lock 同步共享整个进程地址空间atomic/mutex 精细同步IPC 难度内置 Queue/Pipe开箱即用底层系统调用代码量大、跨平台难适用场景IO 多线程CPU 计算多进程高性能计算多线程服务隔离多进程内存控制GC 自动回收不用手动管理手动管理内存野指针、内存泄漏风险高跨平台一致性threading/multiprocessing 一套代码跑 Win/Linux线程跨平台进程 Linux/Windows 代码分离五、核心概念对比总结1. 线程层面核心区别Python 致命限制 GIL解释器层面强制单字节码执行多线程仅 IO 并发计算场景失效C 原生内核线程直接调度 CPU 核心无任何全局锁多线程并行算力拉满是高性能并发基础 两者共性同进程线程共享内存都需要互斥锁解决竞争线程切换开销都远小于进程。2. 进程层面核心区别Python封装好multiprocessing屏蔽操作系统差异内置成熟 IPC 工具上手简单代价是每个进程独立解释器内存占用高C无标准进程封装必须区分 Linux/Windows 系统调用IPC 全部手动实现优势是底层可控、无解释器额外内存开销适合大型后台服务隔离。3. 设计思路差异Python 并发设计优先牺牲计算性能换取开发效率靠多进程绕过 GIL 弥补多核短板C 并发设计贴近操作系统底层零额外抽象开销追求极致性能开发成本更高。