多任务--进程
并发:
计算机一个内核处理多个任务,其实就是内核在任务间不停的切换,达到好像多个任务同时在执行,实际上每个时刻只有一个任务在执行
并行:
多个任务利用计算机的多核同时执行,达到并行的效果
进程:
进程是程序在计算机种运行,代表是的是程序运行的一个状态
进程的状态:
就绪态:进程具备执行条件,等待cpu分配资源
运行态:进程占用cpu时间片
等待态:进程暂停运行,让出时间片
相关的进程函数
os.getpid()
os.getppid()
os.exit()
sys.exit()
python实现多进程:
------基于fork实现: windows上不支持。只支持linux和unix系统
注意。如果os.fork()创建子进程成功。那么会将父进程的内存空间和代码复制一份给子进程。所以下例中,a变量和print(os.getpid())语句也带到了子进程中,所以会打印两次print(os.getpid())
import os from time import sleep pid = os.fork() #开启子进程,并将自己的内存空间和代码全部复制给子进程 a = 1 #在当前继承将a=1放到内存空间 print(os.getpid()) if pid < 0: #pid<0,进程创建失败 print('create process failed') elif pid == 0: #子进程走这里 print('this is new process') print('a=',a) else: #父进程走这里 print('tihs is old process')

---基于multiprocessing创建进程
from multiprocessing import Process
--Process()
功能 : 创建进程对象
参数 : target 绑定要执行的目标函数
args 元组,用于给target函数位置传参
kwargs 字典,给target函数键值传参
''' multiprocessing创建进程 1.编写进程函数 2.生成进程对象 3.启动进程 4.回收进程 ''' from multiprocessing import Process from time import sleep # 有参数的进程函数 def worker(sec,name): for i in range(3): sleep(sec) print("I'm %s"%name) print("I'm working...") # 创建进程对象,通过args 给函数位置传参 p = Process(target=worker,args=(2,), kwargs={'name':'Baron'}) #启动子进程 p.start() #其中2表示,只阻塞2秒,2秒过后,子进程自动结束 #回收子进程 p.join()
---如何创建多个子进程
from multiprocessing import Process from time import sleep import os def th1(): sleep(3) print("吃饭") print(os.getppid(),'--',os.getpid()) def th2(): sleep(2) print("睡觉") print(os.getppid(),'--',os.getpid()) def th3(): sleep(4) print("打豆豆") print(os.getppid(),'--',os.getpid()) things = [th1,th2,th3] jobs = [] for th in things: p = Process(target=th) jobs.append(p) # 对进程对象进行存储 p.start() # [i.join() for i in jobs] # 一起回收 for i in jobs: i.join()
--进程池
进程的创建和销毁的过程会消耗的资源较多,如果任务量很多,每个任务又是在很短时间内完成,需要频繁创建进程和销毁,因此消耗大量的计算机资源,所以我们可以创建一定数量的进程来处理事件,事件处理完进 程不退出而是继续处理其他事件,直到所有事件全都处理完毕统一销毁。增加进程的重复利用,降低资源消耗。
from multiprocessing import Pool from time import sleep,ctime def worker(msg): sleep(3) print(ctime(),'--',msg) #创建进程池 p = Pool(3) #向进程池队列添加事件 for i in range(5): msg = 'Tedu %d'%i p.apply_async(func=worker,args=(msg,)) p.close() p.join() #上述中,只开启三个进程的进程池,但在进程池中需要执行5个任务, # 所以进程池一次执行三个,但是当这三个进程执行完成后,进程并不销毁,而是给剩下的两个任务执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律