博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程同步锁 队列
阅读量:5073 次
发布时间:2019-06-12

本文共 4027 字,大约阅读时间需要 13 分钟。

-------------------------------------------------------------------突破自己很难,但是不要放弃,相信时间的力量,一起都是最好的安排!

# # ------------------------------------------------------------------------------------------------------------#

守护进程:主进程的代码运行结束,守护进程跟着结束

进程同步:

同步锁(互斥锁)  ***** 重点

保证数据安全用的,但是将锁起来的那段代码的执行变成了同步\串行,牺牲了效率,保证了安全

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('主进程结束') # --------------*******--------------

 

转载于:https://www.cnblogs.com/dealdwong2018/p/10033277.html

你可能感兴趣的文章
JAVA面试常见问题之Redis篇
查看>>
jdk1.8 api 下载
查看>>
getElement的几中属性介绍
查看>>
HTML列表,表格与媒体元素
查看>>
雨林木风 GHOST_XP SP3 快速装机版YN12.08
查看>>
数据结构3——浅谈zkw线段树
查看>>
Introduction to my galaxy engine 2: Depth of field
查看>>
设计器 和后台代码的转换 快捷键
查看>>
STL容器之vector
查看>>
数据中心虚拟化技术
查看>>
复习文件操作
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
JavaScript 克隆数组
查看>>
eggs
查看>>
一步步学习微软InfoPath2010和SP2010--第七章节--从SP列表和业务数据连接接收数据(4)--外部项目选取器和业务数据连接...
查看>>
oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec
查看>>
基于grunt构建的前端集成开发环境
查看>>
利用循环播放dataurl的视频来防止锁屏:NoSleep.js
查看>>