• 锁机制,信号机制,事件机制,生产者消费者模型


    day36----锁机制,信号机制,事件机制,生产者消费者模型

    1.锁机制----------Lock模块

      l = Lock()

      l.acquire()  拿钥匙,锁门.别的程序无法操作

      l.release()  还钥匙,开门.允许其他进程操作

    from multiprocessing import Process,Lock  -----------------------导入Process,Lock模块
    import time -----------------------导入time模块

    def cherk(i): -----------------------定义一个函数 cherk() 查询还剩余多少余票
    with open("车票") as f:
    con = f.read()
    print("第%s个人查到还剩余%s张车票" % (i,con))
    def buy_ticket(i,l): -----------------------定义一个函数,进行购票操作
    l.acquire() ---------------------- 将购买票的操作上锁,此进程在购票过程其他进程无法进行操作
    with open("车票") as f:
    con = int(f.read())
    time.sleep(0.1)
    if con> 0 : -----------------------先检查是否剩余车票,车票还有剩余可以进行购票
    print("第%s个人,买到票了" % i)
    con -= 1
    else:
    print("第%s个人,没有买到票" % i)
    time.sleep(0.1)
    with open("车票","w") as f:
    f.write(str(con))
    l.release()

    if __name__ == '__main__': --------------------- 当新建进程的时候,此下面的代码不会被执行
    l = Lock() -------------------- 实例化一个锁子
    for i in range(10): -------------------- 循环创建进程,进行查询过程
    p_cherk = Process(target=cherk,args=(i+1,))
    p_cherk.start()
    for el in range(10): --------------------- 循环创建进程,进行购票操作
    p_buy = Process(target=buy_ticket,args=(el+1,l))
    p_buy.start()


    2.信号量-------Semphore
      sem = Semphore(5) 5表示可以有5个进程同时进行操作数据,而后面的进程必须等待前面的数据执行结束才可以进来

    from multiprocessing import Process,Semaphore    -------------------------------------------  导入模块 Process,Semphore 
    import time ------------------------------------------- 导入模块 time
    import random                      ------------------------------------------- 导入模块 random

    def func(i,sem): ------------------------------------------ 定义一个函数 func()
    sem.acquire()                   ------------------------------------------ 拿钥匙####sem已经定义过可以有几个进程同时进来
    print('第%s个人进入小黑屋,拿了钥匙锁上门' % i)
    time.sleep(random.randint(3,5))
    print('第%s个人出去小黑屋,还了钥匙打开门' % i)
    sem.release()                 ------------------------------------------- 还钥匙#### 有进程结束之后,归还钥匙,其他进程才可以进来操作

    if __name__ == '__main__':
    sem = Semaphore(5)# 初始化了一把锁5把钥匙,也就是说允许5个人同时进入小黑屋 ------------------ 实例化Semaphore
    # 之后其他人必须等待,等有人从小黑屋出来,还了钥匙,才能允许后边的人进入
    for i in range(20):
    p = Process(target=func,args=(i,sem,))        ------------------- 循环生成进程,并且将参数 i,sem 传递给函数func
    p.start()



    3.事件 ------------- 模块Event
    e = Event() 四个方法: e.set() 修改 e.is_set 为True e.clear 修改 e.is_set 为False e.wait() 判断e.is_set 是True还是False, True继续执行 False救会停止

    from multipressing import Event --------------------------------- 导入Event模块
    e = Event()        --------------------------------- 实力化一个Event的对象
    print(e.is_set()) --------------------------------- 查看一下e.is_set() 状态是True还是False
    e.set()                --------------------------------- 将e.is_set() 设置成为True,e.wait()此时是非阻塞状态.(默认是False,阻塞状态)
    e.wait() --------------------------------- 判断状态,继续执行还是停止执行
    print(e.is_set())       --------------------------------- 打印状态

    print(123) -------------------------------- 输出123
    e.clear()              -------------------------------- 将e.is_set() 设置成为False,阻塞状态.
    print(e.is_set())
    e.wait()
    print(123)














  • 相关阅读:
    查看本机上的端口使用情况netstat -an
    WCF中的由于目标计算机积极拒绝,无法连接
    联想G480安装CentOS电缆驱动器
    "伪中国移动client"--伪基站诈骗
    Median of Two Sorted Arrays--LeetCode
    poj3671Dining Cows(DP)
    更多RANK37
    《Java并发编程实战》第二章 线程安全 札记
    Windows下一个SlikSVN使用
    (一个)AngularJS获取贴纸Hello World
  • 原文地址:https://www.cnblogs.com/kcwxx/p/9511899.html
Copyright © 2020-2023  润新知