# 进程 # multiprocessing 处理进程 from multiprocessing import Process # 开启子进程 # p = Process(target = 某个函数名 ,args = (参数1,参数2)) # p.start() # 子进程和主进程 # 1.数据隔离 # 2.主进程等待子进程结束之后再结束 # 3.子进程和主进程之间默认是异步的 # 4.守护进程 :在开启子进程之前可以设置子进程为守护进程,p.daemon = True # 守护进程随着主进程的代码执行结束而结束 # 5.start/terminate 都是非阻塞的 from multiprocessing import Lock # 锁 -- 互斥锁 # 为什么要有锁? # 保证数据的安全 # 多个进程使用同一份数据资源的时候/操作文件、操作共享数据、操作数据库 # acquire/release from multiprocessing import Queue # IPC 进程之间的通信 # 之所以有队列,是因为队列可以完成进程之间的消息传递 # 队列 :在进程之间数据安全(进程安全) # 队列 :socket + pickle +锁 == 管道 + 锁 # 管道是进程安全的么???不是 # 管道 :socket + pickle # 生产者消费者模型 # 解决数据的 获取 和 处理 之间 时间不对等的情况 # 能够自由的添加 生产者和消费者的数量 以达到在相同的事件中 数据的处理速度能达到一个最大值 # queue = Queue(5) # get/put from multiprocessing import Manager # 给我们提供了很多能够实现数据共享的工具 dict/list # dict 能够在进程之间进行数据共享 -- 进程不安全 # += -= *= /= 数据不安全 都需要加锁 # dic['k'] += 1 # lst[1] += 1 from multiprocessing import Pool # 进程池 # 为什么要有进程池? # 节省资源和操作系统的调度成本 # 一般情况下:开启的进程个数 cpu个数 1-2倍之间 # p = Pool() # 默认是cpu的核数 # p.map(func,iterable)/p.apply_async(func,args = (1,2,3)) # 进程池,同一时间最多有多少个进程能够同时执行任务? 和进程池中进程的个数有关系 # p.apply_async --> 使用close/join来保证主进程等待所有进程池中的任务执行完毕 # ret = p.apply_async(...) --> 在提交所有任务之后,从ret中获取结果(函数的返回值)也能够让主进程等待池中任务都完成 # 回调函数 callback参数,用来保证一个任务在执行完毕之后,立刻出发callback回调函数中的内容,并且子进程的函数返回值作为callback函数的参数 # 1.进程是一个开销比较大的机制 # 2.进程之间数据隔离 # 3.阻塞会影响进程的执行效率 # 4.过多的进程会给操作系统带来不小的压力 # 5.在有多个任务的时候要注意控制进程的数量 —— 进程池
进程概念理解!
最新推荐文章于 2022-11-03 19:45:06 发布