-------------------------------------------------------------------突破自己很难,但是不要放弃,相信时间的力量,一起都是最好的安排!
# # ------------------------------------------------------------------------------------------------------------#
守护进程:主进程的代码运行结束,守护进程跟着结束
进程同步:
同步锁(互斥锁) ***** 重点
保证数据安全用的,但是将锁起来的那段代码的执行变成了同步\串行,牺牲了效率,保证了安全
L = Lock()
L.acquire()
数据操作
L.release()
信号量
Semaphore 内部维护了一个计数器,acquire - 1,release + 1,当计数器为0的时候,阻塞其他进程
事件
e = Event, 事件初识状态为False,当事件为Flase,e.wait()的地方会阻塞,e.set()将e的状态改为True,如果e的状态为True,wait的地方就不等待了,不阻塞了,e.clear()将e的状态改为False, 查看e的状态:is_set,
进程通信(IPC)
队列 ***** 重点
队列:进程安全的,能够保证数据安全,
Q = queue(4) ,给队列设定一个固定的长度,q.put(),q.get(),q.get_nowait(),q.get(False),
Q.put()在队列满了的时候会阻塞和q.get在队列空了之后会阻塞
Q.put_nowait()
Q.full q.empty
生产者消费者模型
缓冲区解耦的事情
Joinablequeue,能记录着你往队列里面put的数据量
其他方法和queue是一样的,比queue多了两个方法:q.task_done,q.join
明日预习: https://www.cnblogs.com/clschao/articles/9629392.html
管道
数据共享
进程池
今日作业:
1.多进程:写两个纯计算的任务,开两个子进程来执行,统计一下这两个任务的执行时间,再统计一下两个任务串行执行的时间
2.基于队列写一个多个生产者和多个消费者的模型
3.基于锁的抢票代码,能够并发查询票数和并发抢票操作.
# --------------[进程同步锁]-------------- from multiprocessing import Process, Lock import os, time def work(n, lock): # 加锁 保证每次只有一个进程执行锁里面的程序,这一段程序对于所有写上这个锁的进程,大家都变成了串行 lock.acquire() print('%s: %s is Run' % (n, os.getpid())) time.sleep(1) print('%s: %s is Done' % (n, os.getpid())) # 解锁,解锁之后其他进程才能去执行自己的程序 lock.release() if __name__ == '__main__': lock = Lock() for i in range(5): p = Process(target=work, args=(i, lock)) p.start() --------------[进程同步锁++模拟抢票]-------------- from multiprocessing import Process, Lock import time, json def search(): dic = json.load(open('Qi.txt')) # 打开文件 直接获取文件中的内容,按到文件中包含的剩余票数的字典 print('剩余票数:%s' % dic['count']) # 抢票 def get(): dic = json.load(open('Qi.txt')) time.sleep(1) # 模拟网络延迟 进程之间的 切换导致所有人拿到的字典都是{'count:1'},也就是每个人都拿到了这一票 if dic['count'] > 0: dic["count"] -= 1 time.sleep(0.2) json.dump(dic, open('Qi.txt', 'w')) print('抢票成功') def task(): search() get() if __name__ == '__main__': for i in range(3): p=Process(target=task) p.start() --------------[进程同步锁++模拟抢票+上锁操作]-------------- from multiprocessing import Process,Lock import time,json,random def search(): dic = json.load(open('Qi.txt')) # 打开文件 直接获取文件中的内容,按到文件中包含的剩余票数的字典 print('剩余票数:%s' % dic['count']) # 抢票 def get(): dic=json.load(open('Qi.txt')) time.sleep(0.1) #模拟读数据的网络延迟,那么进程之间的切换,导致所有人拿到的字典都是{"count": 1},也就是每个人都拿到了这一票。 if dic['count'] >0: dic['count']-=1 time.sleep(0.2) #模拟写数据的网络延迟 json.dump(dic,open('Qi.txt','w')) #最终结果导致,每个人显示都抢到了票,这就出现了问题~ print('购票成功!') else: print('sorry,没票了!') def task(lock): search() #因为抢票的时候是发生数据变化的时候,所有我们将锁加加到这里 lock.acquire() get() lock.release() if __name__ == '__main__': lock = Lock() #创建一个锁 for i in range(3): #模拟并发100个客户端抢票 p=Process(target=task,args=(lock,)) #将锁作为参数传给task函数 p.start() # --------------[事件]-------------- from multiprocessing import Process,Event e = Event() # Event 开启事件,有两个状态 一个是Ture 一个是False 默认是False print('开始') print('>>>',e.is_set()) #查看事件的状态 e.set() #将时间对象的状态改为True print('>>>',e.is_set()) e.clear() #将时间事件状态改为False e.wait() # 等待,当状态事件为True时 执行后面的程序 如果为False则继续等待 print('结束') # --------------[队列]-------------- from multiprocessing import Queue q = Queue(3) q.put("s") q.put("b") print(q.full()) #q.full() 对垒满了返回True 不满 返回False #---> False q.put("d") print(q.full()) #q.full() 对垒满了返回True 不满 返回False #---> True print(q.get()) print(q.get()) print(q.get()) q.get_nowait() # --------------[基于队列的进程间的通讯]-------------- from multiprocessing import Queue from multiprocessing import Process def fun(m): res = q.get() print(res) if __name__ == '__main__': q =Queue(5) q.put('helloword!') p = Process(target=fun,args=(m,)) p.start() print('主进程结束') # --------------*******--------------