zoukankan      html  css  js  c++  java
  • 并发编程的那些事(三)

    1、锁机制

      为了保护数据,有了锁机制,

      from multiprocessing import Lock     导入锁模块

      以存取钱为例

      当你在存钱的时候,你的女朋友/男朋友正在取钱,此时你存10,他取10,由于数据没能及时更新,就有可能造成数据混乱。

      一把钥匙配一把锁

      

      包括12306购票系统也是应用了锁机制,保证在人多票少的情况下,不会出现多个人买到同一张票的情况。

      

    from multiprocessing import Process, Lock
    import time
    
    
    def check_ticket(i):
        with open('remainder', 'r', encoding='utf-8')as f:
            count = int(f.read())
            print('第%s个人查到%s张票' % (i, count))
            # time.sleep(0.1)
    
    def buy_ticket(i, l):
        l.acquire()
        with open('remainder', 'r', encoding='utf-8')as f:
            count = int(f.read())
            time.sleep(0.1)
        if count > 0:
            print('33[31m第%s个人抢到了一张票33[0m' % i)
            count -= 1
    
        else:
            print('33[33m第%s个人没有买到票33[0m' % i)
        time.sleep(0.1)
        with open('remainder', 'w', encoding='utf-8')as f:
            f.write(str(count))
            l.release()
    
    
    if __name__ == '__main__':
        l = Lock()
        for i in range(10):
            p1 = Process(target=check_ticket, args=(i + 1,))
            p1.start()
        time.sleep(0.1)
        for i in range(10):
            p2 = Process(target=buy_ticket, args=(i + 1, l))
            p2.start()
    抢票系统

    2、信号机制

      

    3、事件机制

      Event

      e = Event()

      e.is_set()  默认为False ,是一种标识

      e.set()  可以将e.is_set()改为 True

      e.clear()  可以将e.is_set()改为 False

      e.wait()  判断is_set()的bool值,如果为True,则非阻塞,如果为False ,则阻塞。

      

    from multiprocessing import Process, Event
    import time
    import random
    
    
    def traffic_light(e):
        while 1:
            if e.is_set():
                time.sleep(5)
                print('33[31m红灯了!33[0m')
                e.clear()
            else:
                time.sleep(5)
                print('33[32m绿灯了!33[0m')
                e.set()
    
    
    def Car(i, e):
        e.wait()
        print('第%s辆车过去了' % i)
    
    
    if __name__ == '__main__':
        e = Event()
        p = Process(target=traffic_light, args=(e,))
        p.start()
        for i in range(20):
            time.sleep(random.randint(1, 3))
            p1 = Process(target=Car, args=(i + 1, e))
            p1.start()
    模拟红绿灯 (事件机制)

  • 相关阅读:
    鉴权系统的梳理及并发问题的考虑
    分布式事物解决选择
    电商平台客服和商铺的数据表设计( 初稿记录)43
    问题整理
    关于
    问题整理
    问题整理(常问3连)
    问题整理
    强引用、软引用、弱引用、幻象引用的区别
    通过aop获取切面方法请求入参名称和值的json打印
  • 原文地址:https://www.cnblogs.com/wf123/p/9514405.html
Copyright © 2011-2022 走看看