建设银行管官方网站,哪里可以建设网站,什么是电商平台怎么加入电商平台,wordpress phpstudy1. 进程基础概念
1.1 什么是进程#xff1f;
进程(Process)是指正在执行的程序#xff0c;是程序执行过程中的一次指令、数据集等的集合。简单来说#xff0c;进程就是程序的一次执行过程#xff0c;它是一个动态的概念。
想象你打开电脑上的音乐播放器听歌#xff0c;…1. 进程基础概念
1.1 什么是进程
进程(Process)是指正在执行的程序是程序执行过程中的一次指令、数据集等的集合。简单来说进程就是程序的一次执行过程它是一个动态的概念。
想象你打开电脑上的音乐播放器听歌同时又在用浏览器上网这两个就是不同的进程。操作系统会为每个运行的程序创建一个进程让它们看起来像是同时在运行。
1.2 进程的特征 动态性进程有创建、执行、暂停、终止等生命周期 并发性多个进程可以同时存在于内存中在一段时间内交替执行 独立性每个进程拥有独立的地址空间和系统资源 异步性进程执行速度不可预知可能随时被中断
1.3 进程与程序的区别
区别点程序进程状态静态的代码集合动态的执行过程生命周期永久保存暂时存在资源占用不占用系统资源占用CPU、内存等资源
2. 进程调度算法
操作系统使用调度算法决定哪个进程可以使用CPU资源
2.1 先来先服务(FCFS) 按照进程到达的顺序执行 简单但不利于短作业 示例排队买票先到先得
processes [P1, P2, P3]
for p in processes:print(f正在执行{p})
2.2 短作业优先(SJF) 优先执行预计运行时间短的进程 能减少平均等待时间 但难以准确预估作业长度
processes [(P1,3), (P2,1), (P3,2)]
processes.sort(keylambda x: x[1]) # 按执行时间排序
2.3 时间片轮转(RR) 每个进程分配一个时间片(如100ms) 时间片用完就切换到下一个进程 公平但上下文切换开销大
from collections import deque
ready_queue deque([P1, P2, P3])
time_slice 1 # 单位时间while ready_queue:p ready_queue.popleft()print(f执行{p} {time_slice}单位时间)ready_queue.append(p) # 重新加入队列
2.4 多级反馈队列 结合了多种算法的优点 设置多个优先级不同的队列 新进程进入高优先级队列 长时间运行的进程会被移到低优先级队列
3. 进程的并行与并发 3.1 基本概念 并行(Parallelism) 指多个任务真正同时执行需要多核CPU支持。就像餐厅有多个厨师同时做不同的菜。 # 并行示例假设4核CPU
from multiprocessing import Pooldef task(n):return n * nif __name__ __main__:with Pool(4) as p: # 创建4个进程print(p.map(task, [1, 2, 3, 4])) # 4个任务真正同时执行 并发(Concurrency) 指多个任务交替执行在单核CPU上通过快速切换实现看似同时。就像一个厨师轮流做多道菜。 # 并发示例
from multiprocessing import Process
import timedef task(name):print(f{name}开始)time.sleep(1)print(f{name}结束)if __name__ __main__:processes []for i in range(3): # 单核CPU上交替执行p Process(targettask, args(f任务{i},))p.start()processes.append(p)for p in processes:p.join() 3.2 关键区别 特性并行并发硬件要求需要多核CPU单核即可执行方式真正同时执行交替执行效率更高理想情况相对较低适用场景CPU密集型任务I/O密集型任务图示同时进行→→快速切换 3.3 Python中的实现特点 GIL限制由于全局解释器锁(GIL)Python多线程无法实现真正的并行多进程是Python实现并行的主要方式 进程开销进程创建和上下文切换开销比线程大适合CPU密集型任务 multiprocessing模块绕过GIL限制充分利用多核CPU 4. 同步/异步与阻塞/非阻塞 4.1 进程的三种基本状态 4.2 同步 vs 异步 同步Synchronous 像排队买奶茶必须等前一个人完成才能轮到你 代码示例 from multiprocessing import Process, Lockdef sync_task(lock, num):with lock: # 同步锁print(f进程{num}开始工作)time.sleep(1)print(f进程{num}结束)if __name__ __main__:lock Lock()for i in range(3):Process(targetsync_task, args(lock, i)).start() 异步Asynchronous 像取号等餐拿到号后可以去做其他事 代码示例 from multiprocessing import Pooldef async_task(num):print(f开始异步任务{num})time.sleep(1)return num * 10if __name__ __main__:with Pool(3) as p:results [p.apply_async(async_task, (i,)) for i in range(3)]for res in results:print(res.get()) # 需要时才获取结果 4.3 阻塞 vs 非阻塞 阻塞Blocking 像打电话订餐必须等客服回应才能做下一件事 典型表现join(), get()等方法会阻塞 p Process(targettime.sleep, args(5,))
p.start()
p.join() # 这里主程序会阻塞等待
print(子进程结束) 非阻塞Non-blocking 像发短信订餐发完就可以做其他事 典型表现不调用join()或使用Queue的nowait processes []
for i in range(3):p Process(targettime.sleep, args(i,))p.start()processes.append(p)# 主进程继续执行其他代码...
print(主进程继续运行)# 最后再统一等待
for p in processes:p.join() 4.4 四种组合模式重点理解 同步阻塞 最传统的方式 示例直接函数调用等待返回结果 result time.sleep(3) # 同步调用阻塞等待 同步非阻塞 轮询检查状态 示例检查进程是否完成 while True:if not p.is_alive():breaktime.sleep(0.1) 异步阻塞 较少使用 示例使用回调但主线程等待 def callback(result):print(回调结果:, result)with Pool() as pool:res pool.apply_async(func, args, callbackcallback)res.wait() # 这里又变成了阻塞 异步非阻塞 最高效的方式 示例使用进程池回调 def callback(result):print(Got result:, result)with Pool() as pool:for i in range(5):pool.apply_async(functime.sleep,args(1,),callbackcallback)print(主进程继续执行...)pool.close()pool.join() 4.5 实际应用场景建议 模式适用场景Python实现方式同步阻塞简单线性任务直接函数调用同步非阻塞需要轮询的任务循环检查is_alive()异步阻塞较少使用apply_asyncwait()异步非阻塞高并发I/O操作进程池回调函数 4.6 完整代码示例综合应用
多进程模式下载器示例
演示并行、异步非阻塞模式from multiprocessing import Pool
import time
import randomdef download(url):print(f开始下载 {url})time.sleep(random.uniform(1, 3)) # 模拟下载时间print(f完成下载 {url})return f{url}_内容def save_content(result):print(f保存结果: {result})if __name__ __main__:urls [http://example.com/1,http://example.com/2,http://example.com/3,http://example.com/4]with Pool(4) as pool: # 创建进程池# 异步非阻塞模式提交任务results [pool.apply_async(download, (url,), callbacksave_content) for url in urls]print(主进程可以继续处理其他任务...)# 最终等待所有任务完成pool.close()pool.join()print(所有下载任务完成!) 这个示例展示了 并行执行4个下载任务同时进行 异步非阻塞模式提交任务后立即继续执行 回调机制下载完成后自动保存 5. Python中的进程操作 Python通过multiprocessing模块实现多进程编程下面介绍几种创建进程的方式。 5.1 方式一使用Process类直接创建 from multiprocessing import Process
import osdef func(num):print(f这是一个普通方法{num})print(f我是子进程我的pid{os.getpid()}我的父进程编号{os.getppid()})if __name__ __main__:# 创建进程对象p1 Process(name路飞, targetfunc, args(1,))# 启动进程p1.start()# 输出父进程信息print(f我是父进程我的pid{os.getpid()}我的父进程编号{os.getppid()})print(p1) 代码解析 导入Process类和os模块 定义目标函数func它将在子进程中执行 创建Process实例指定目标函数和参数 调用start()方法启动进程 os.getpid()获取当前进程IDos.getppid()获取父进程ID 5.2 方式二继承Process类创建 from multiprocessing import Process
import osclass MyProcess(Process):def __init__(self, *args):super(MyProcess, self).__init__()self.args argsdef run(self):print(f我是子进程{self.args[0]})if __name__ __main__:p1 MyProcess(1)p2 MyProcess(2)p3 MyProcess(3)p1.start()p2.start()p3.start() 代码解析 自定义类继承Process类 重写run()方法定义进程执行逻辑 创建自定义类的实例并启动 这种方式更面向对象适合复杂任务 5.3 进程常用方法 from multiprocessing import Process
import timedef fun():print(我是子进程)for i in range(3):time.sleep(5)print(f我是子进程{i})if __name__ __main__:p1 Process(name路飞, targetfun)p1.start()p1.join() # 父进程等待子进程结束for i in range(2):time.sleep(1)print(f我是父进程{i}) 关键方法 p.start()启动进程并调用该子进程中的p.run() p.run () 进程启动时运行的方法正是它去调用target 指定的函数我们自定义类的类中一定要实现该方法 p.join([timeout])主线程等待p终止强调是主线程处于等的状态而p是处于运行的状态。 timeout 是可选的超时时间需要强调的是 p.join 只能 join 住 start 开启的进程而不能 join 住 run 开启的进程 p.is_alive()如果p仍然运行返回True p.terminate()强制终止进程p不会进行任何清理操作如果p创建了子进程该子进程就成了僵尸进 程。使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放进而导致死锁 5.4 进程常用属性 from multiprocessing import Process
import timedef fun():for i in range(10):time.sleep(1)print(我是子进程)if __name__ __main__:p Process(targetfun)p.daemon True # 设置为守护进程p.start()time.sleep(5)print(我是父进程) 重要属性 daemon默认值为False如果设为True代表p为后台运行的守护进程当p的父进程终止时 p也随之终止并且设定为True后p不能创建自己的新进程必须在p.start()之前设置 守护进程跟随着父进程的代码执行结束守护进程就结束 name进程名称 pid进程ID exitcode进程在运行时为None、如果为–N表示被信号N结束(了解即可) 6. 进程同步与通信 6.1 进程间数据隔离 from multiprocessing import Processdef work():global nn 0print(子进程内: , n)if __name__ __main__:n 100p Process(targetwork)p.start()print(主进程内: , n) 输出结果 主进程内: 100
子进程内: 0 解释进程间内存空间独立修改子进程中的变量不会影响父进程。 7. 实际应用建议 CPU密集型任务适合使用多进程可以充分利用多核CPU I/O密集型任务多线程可能更合适避免进程创建开销 守护进程用于执行后台任务如日志记录、监控等 进程池当需要创建大量进程时考虑使用Pool类 8. 注意事项 Windows平台必须使用if __name__ __main__:保护主代码 进程创建和销毁开销较大不宜创建过多进程 进程间通信需要使用队列(Queue)或管道(Pipe)等机制 避免僵尸进程(子进程结束但父进程未回收资源)