进程同步锁 队列

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

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

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

进程同步:

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

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

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


# --------------*******--------------

 

posted @ 2018-11-28 17:08  黄豆豆丨Dealdwong  阅读(244)  评论(1编辑  收藏  举报