首页 > 编程语言 > 详细

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

时间:2019-01-10 00:48:43      阅读:287      评论:0      收藏:0      [点我收藏+]

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

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

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

守护进程: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操作,都感觉自己抢到票了,导致结果也不一样

技术分享图片

 

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

原文:https://www.cnblogs.com/zaizai1573/p/10247646.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!