Python 进程与线程简要概述

Python 进程与线程简要概述 Python 进程与线程简要概述一、核心理解进程Process独立的程序实例资源隔离重进程之间数据是相互隔离的.因为子进程相当于是父进程的副本, 会将父进程的main外的代码拷贝一份, 即: 各是各的.默认情况下, 主进程会等待子进程执行结束再结束.如果要设置主进程结束, 子进程同步结束, 方式如下:1 设置子进程为 守护进程.2 强制关闭子进程.可能会导致子进程变成僵尸进程, 交由Python 解释器自动回收(底层有 init初始化进程来管理维护).线程Thread进程内的执行单元共享资源轻1.线程间执行是 无序2.主线程会等所有子线程执行结束再结束3.线程间共享全局变量4.线程间共享全局变量数据会出问题 互斥锁二、对比一眼看懂维度 进程 线程是否独立 ✅ 完全独立 ❌ 依赖进程内存 各自独立 共享同一块内存创建成本 高 低通信 IPC复杂 直接共享变量稳定性 高互不影响 低容易互相影响并行能力 ✅ 真并行 ❌ Python受GIL限制三、Python 特别关键点重点1️⃣ GIL全局解释器锁PythonCPython同一时间只允许一个线程执行Python字节码 多线程 ≠ 真并行CPU密集任务无效2️⃣ 怎么选 CPU密集型计算、AI推理、数据处理使用多进程 IO密集型网络、爬虫、API请求使用多线程四、简单代码对比多线程示例 1.线程间执行是 无序 2.主线程会等所有子线程执行结束再结束 3.线程间共享全局变量 4.线程间共享全局变量数据会出问题 互斥锁 importthreading# 创建线程锁.current_lockthreading.Lock()deftask1():current_lock.acquire()# 加锁print(线程1执行)current_lock.release()# 释放锁deftask2():current_lock.acquire()# 加锁print(线程2执行)current_lock.release()# 释放锁# def __init__(self, groupNone, targetNone, nameNone,args(), kwargsNone, *, daemonNone):if__name____main__:#函数# def __init__(self, groupNone, targetNone, nameNone,args(), kwargsNone, *, daemonNone):#daemon 线程守护#方法1t1threading.Thread(targettask1,daemonTrue)t2threading.Thread(targettask2,daemonTrue)#方法2#t1.setDaemon(True) 过期方法 还能用t1.start()t2.start()#t1.join() #关键代码。 会阻塞主线程#time.sleep(1)print(主线程结束)#如果daemon flase 主线程会结束但是程序不会推出会等待子线程多进程示例 每个程序(进程)都有自己的唯一进程id, 当程序释放的时候, 该进程id也会释放. 即: 进程id是可以重复使用的. 细节: main中创建的进程, 如果没有特殊指定, 它的父进程都是main进程, 而main进程的父进程是 PyCharm程序的pid 格式: 查看当前进程的pid: os模块(operating, 系统模块) 的 getpid() get Process id multiprocessing#current_process()的pid属性 查看当前进程的ppid: parent process id(父进程id) os#getppid() multiprocessing.Process def __init__(self, groupNone, targetNone, nameNone, args(), kwargs{}, group-参数未使用始终为None target-调用对象即子进程要执行的任务*回调函数入口地址 args-表示以元组的形式向子任务函数传参元组方式传参一定要和参数的顺序保持一致 kwargs-表示以字典的方式给自认为函数传参字典方式传参字段中的key要和参数名保持一致 name-为子进程的名称 frommultiprocessingimportProcessdeftask1(name,action_name):print(fp1进程的pid:{os.getpid()},{multiprocessing.current_process().pid}, 父进程id(ppid为) :{os.getppid()})deftask2(name,action_name):print(fp2进程的pid:{os.getpid()},{multiprocessing.current_process().pid}, 父进程id(ppid为) :{os.getppid()})# 1.创建主进程(主线程)if__name____main__:# 2.创建两个子进程, 分别关联上述的目标函数.p1Process(targettask1,args(张三,煮饭))p2Process(targetmusic,kwargs{name:李四,action_name:杀猪})p1.daemonTrue# 设置p1为: 守护进程.# 3.开启子线程p1.start()p2.start()# 4. 查看主进程的信息.print(fmain进程的pid:{os.getpid()},{multiprocessing.current_process().pid}, 父进程id(ppid为) :{os.getppid()})五、通俗类比进程 多个 App线程 App 内多个任务线程依赖进程, 进程是CPU分配资源的基本单位, 线程是CPU调度资源的基本单位进程更消耗资源, 不能共享全局变量, 相对更稳定线程更轻量级, 可以共享全局变量, 相对更灵活六、AI开发场景推荐场景 推荐方案调用APIOpenAI / 各类API Key 多线程爬虫 / 实时监听 多线程本地模型推理 多进程数据处理 / 模型训练 多进程