-------------------------------------------------------------------突破自己很难,但是不要放弃,相信时间的力量,一起都是最好的安排!
# # ------------------------------------------------------------------------------------------------------------#
守护进程:主进程的代码运行结束,守护进程跟着结束
进程同步:
同步锁(互斥锁) ***** 重点
保证数据安全用的,但是将锁起来的那段代码的执行变成了同步串行,牺牲了效率,保证了安全
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('主进程结束')
# --------------*******--------------