您当前的位置: 首页 >  Python

哆啦A梦_i

暂无认证

  • 0浏览

    0关注

    629博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Python:线程锁-卖票案例

哆啦A梦_i 发布时间:2020-10-29 16:01:20 ,浏览量:0

线程锁

1. 概述
  • 主要用来给方法、代码块加锁。
  • 当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一个线程在执行该段代码。
  • 当有多个线程访问同一对象的加锁方法/代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段。但是,其余线程是可以访问该对象中的非加锁代码块的。
2. 机制
  • 多线程可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!为避免错误,使用线程锁。
3. 进程锁 & 分布式锁
  • 进程锁 :也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,但是可以使用本地系统的信号量控制(操作系统基本知识)。
  • 分布式锁 :当多个进程不在同一个系统之中时,使用分布式锁控制多个进程对资源的访问。在分布式集群系统的开发中,线程锁往往并不能支持全部场景的使用,必须引入新的技术方案分布式锁。
4.  线程锁 & 进程锁 & 分布式锁 的异同
  • 同:作用都是一样的,只是作用的范围大小不同。
  • 异:范围大小:分布式锁 > 进程锁 > 线程锁。能用线程锁,进程锁情况下,也可用分布式锁。能用线程锁的情况下,也可用进程锁。只是范围越大技术复杂度就越大。
5. 用法
#创建锁
lock = threading.Lock()
#锁定
lock.acquire([timeout])
#释放
lock.release()
6. 优缺点
  • 优点:保证资源同步 
  • 缺点:比较慢
7. 练习(卖票案例)

完整代码:

import threading,time
ticket = 10
# 创建一把锁
lock = threading.Lock()

def sell_ticket():
    global ticket
    while True:
        lock.acquire()
        if ticket>0:
            time.sleep(1)
            ticket -= 1
            lock.release()
            print('{}卖出1张票,还剩{}张'.format(threading.current_thread().name,ticket))
        else:
            lock.release()
            print('票卖完啦')
            break

t1 = threading.Thread(target=sell_ticket,name='线程1')
t2 = threading.Thread(target=sell_ticket,name='线程2')

t1.start()
t2.start()

运行结果:

线程1卖出1张票,还剩9张 线程1卖出1张票,还剩8张 线程2卖出1张票,还剩7张 线程1卖出1张票,还剩6张 线程2卖出1张票,还剩5张 线程1卖出1张票,还剩4张 线程2卖出1张票,还剩3张 线程2卖出1张票,还剩2张 线程2卖出1张票,还剩1张 线程1卖出1张票,还剩0张 票卖完啦票卖完啦

  •  补充:关于多线程,可查阅小主上一篇文章嘿:Python:多线程介绍https://blog.csdn.net/weixin_44015669/article/details/109360115
关注
打赏
1556978864
查看更多评论
立即登录/注册

微信扫码登录

0.2960s