python 进程锁 生产者消费者模型 队列 (守护进程,数据共享等)

#######################总结#######

主要理解 锁         生产者消费者模型 解耦用的

共享资源的时候 是不安全的 所以用到后面的锁

守护进程:p.daemon = True  #将该进程设置为守护进程,必须写在start之前,意思如果我的主进程代码运行结束了,你这个子进程不管运行到什么地方,都直接结束

#创建一个ticket 文件 里面放上字典
{'count': 1}
#加锁方法
import time
from multiprocessing import Process,Lock

def f1(i,lic):
    lic.acquire()
    time.sleep(1)
    print(i)
    lic.release()

if __name__ == '__main__':
    lic = Lock()
    for i in range(20):
        p = Process(target=f1, args=(i,lic))
        p.start()

抢票程序

import time
from multiprocessing import Process,Lock
def show_t(i):#传参i 10个人查看
    with open('ticket','r',encoding='utf-8') as f:
        ticket_data = f.read()#读取文件里的内容
    t_data = eval(ticket_data)#将里面的文件转成成字典格式
    print('%s查询剩余票数为%s'%(i,t_data['count']))
def get_t(i,l1):#传入10个人进行抢票
    # with l2:第二种写法
    l1.acquire()
        #进行加锁循环,而谁能抢到票是由操作系统决定的
    with open('ticket', 'r', encoding='utf-8') as f:
        ticket_data = f.read()
    t_data = eval(ticket_data)

    if t_data['count'] > 0:#进行判断 如果余票大于0
        t_data['count'] -= 1#就进行减1操作
        print('%s抢票成功'%i)
        time.sleep(0.2)
        with open('ticket', 'w') as f:
            f.write(str(t_data))
    else:
        print('没票了!!!')
    l1.release()
if __name__ == '__main__':
    l1 = Lock()
    for i in range(10):
        p1 = Process(target=show_t,args=(i,))
        p1.start()
    for i in range(10):
        p2 = Process(target=get_t,args=(i,l1) )
        p2.start()

####################
1查询剩余票数为1
2查询剩余票数为1
3查询剩余票数为1
7查询剩余票数为1
0查询剩余票数为1
5查询剩余票数为1
8查询剩余票数为1
6查询剩余票数为1
4查询剩余票数为1
2抢票成功
9查询剩余票数为1
没票了!!!
没票了!!!
没票了!!!
没票了!!!
没票了!!!
没票了!!!
没票了!!!
没票了!!!
没票了!!!

Process finished with exit code 0

如果没有锁  会有10个进程 进行 异步同时请求   这个顺序是由操作系统决定的  每个人都能执行到 if count>0 都执行了 -1操作,都感觉自己抢到票了,导致结果也不一样

猜你喜欢

转载自www.cnblogs.com/zaizai1573/p/10247646.html