python学习之路--threading Lock对象

本文介绍了Python中threading.Lock的使用,通过模拟卖票过程解释了Lock对象在多线程同步中的作用,防止资源竞争导致的非预期结果。Lock的核心方法包括acquire()和release(),并讨论了可能出现的并发问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言
多线程编程最需要注意的是两个点:1.线程同步,2.竞争资源互斥访问。同步,更多的是指线程之间的协同,比如线程B的工作依赖于线程A的结果,即线程之间具有依赖协同的关系。互斥,指的是多个线程对临界资源的访问而产生互斥的关系。这种访问的方式可以是读,也可以是写。举个简单的例子:
Producer-Consumer
这里有两种工作线程,一种Producer,负责向Buffer里面放资源(假设是一个整数)。另一种是Consumer,负责从Buffer里面取出资源来做一些计算。Buffer,可以理解为一个存资源的地方,大小为100。Producer和Consumer可以有多个。那么这里就同步和互斥的问题了。首先,不官是生产者还是消费者,都需要对Buffer进行互斥访问,这是对Buffer这个资源本身而言,可以用一个二值信号量(mutex)来控制对Buffer的互斥访问。其次,对Buffer里面的资源(整数)的访问也需要进行控制。如:Buffer初始为空时,对生产者而言,它有100个资源(空位)可以使用。而对于消费者而言,它能使用的资源个数则为0(Buffer里面没有数可以取)。所以可以使用信号量(Semaphore)来分别表示可用资源的多少。(具体参考《操作系统》相关书籍的互斥和同步章节)
下面进入我们的正题,谈谈python中threading.Lock的使用。

threading.Lock

先上一段代码

import threading
ticket_lock = threading.Lock()
ticket_nums = 20

class SaleTicketThread(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
        print "init thread:%s" % self.name

    def run(self):
        global ticket_nums
        while ticket_nums > 0:
            ticket_lock.acquire()

            ticket_nums = ticket_nums - 1
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值