Python_继承threading实现自己的线程类——六月十四

该代码示例展示了如何使用Python的threading模块创建线程,通过继承Thread类并重写run方法来实现并发售票。全局变量ticket_count和Lock对象用于控制线程同步,防止票数计数出错。两个TicketSeller线程模拟售票员售出电影票,确保在多线程环境下数据的一致性。

当使用Thread类创建线程时,可以通过继承Thread类来创建自定义的线程类,并重写其中的方法。下面是一个形象的例子,用来模拟电影院售票系统的并发处理。

from threading import Thread, Lock

# 全局变量,表示电影票数量
ticket_count = 100

# 创建锁对象,用于线程同步
lock = Lock()


class TicketSeller(Thread):
    """
    售票员线程类
    """

    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        global ticket_count
        while True:
            # 获取锁
            lock.acquire()
            if ticket_count > 0:
                # 模拟售票过程
                ticket_count -= 1
                print(f"{self.name}售出1张票,剩余票数: {ticket_count}")
            else:
                print("票已售罄,停止售票!")
                # 释放锁
                lock.release()
                break
            # 释放锁
            lock.release()


def main():
    # 创建售票员线程对象
    seller1 = TicketSeller("售票员1")
    seller2 = TicketSeller("售票员2")

    # 启动售票员线程
    seller1.start()
    seller2.start()

    # 等待售票员线程执行完毕
    seller1.join()
    seller2.join()

    print("所有售票员线程执行完毕")


if __name__ == '__main__':
    main()

在上述代码中,我们模拟了一个电影院售票系统。首先,定义了一个全局变量ticket_count,表示电影票的数量,初始为100。

然后,创建了一个Lock对象lock,用于线程同步。

接下来,定义了一个TicketSeller类,继承自Thread类,**并重写run方法,你可以在自定义的线程类中定义线程的执行逻辑。然后,通过调用start方法,实际上是在启动一个新线程,并在新线程中执行你所定义的run方法。**在run方法中,通过acquire方法获取锁,然后判断电影票的数量是否大于0。如果大于0,则模拟售票过程,将电影票数量减1,并打印出售票信息。否则,打印出票已售罄的信息,释放锁并结束线程。

main函数中,创建了两个TicketSeller对象,分别代表两个售票员。然后,通过调用start方法启动售票员线程。售票员线程开始执行各自的run方法,并在执行过程中进行售票和打印。

最后,使用join方法等待售票员线程执行完成,确保主线程等待所有售票员线程执行完毕后再继续执行。最后打印出所有售票员线程执行完毕的提示。

通过继承Thread类并重写其中的方法,我们可以自定义线程类,并根据具体需求编写线程的执行逻辑。这样可以实现电影院售票系统的并发处理,

确保线程安全和数据一致性。

在多线程编程中,线程同步是非常重要的。线程同步是指在多个线程并发访问共享资源时,为了避免出现数据不一致或其他问题,需要对线程的执行进行协调和控制。常见的线程同步方式包括锁、信号量、条件变量等。 在 Python 中,线程同步可以通过 threading 模块中的 Lock 类来实现。Lock 类提供了 acquire() 和 release() 方法,用于控制资源的访问。 使用 Lock 类的基本流程如下: 1. 创建 Lock 对象。 2. 在需要访问共享资源的代码块前调用 acquire() 方法获取锁,阻塞其他线程对该资源的访问。 3. 在访问共享资源的代码块后调用 release() 方法释放锁,允许其他线程对该资源的访问。 下面是一个使用 Lock 类实现线程同步的示例: ```python import threading # 共享资源 count = 0 # 创建 Lock 对象 lock = threading.Lock() def add(): global count for i in range(100000): # 获取锁 lock.acquire() count += 1 # 释放锁 lock.release() def sub(): global count for i in range(100000): # 获取锁 lock.acquire() count -= 1 # 释放锁 lock.release() # 创建两个线程 t1 = threading.Thread(target=add) t2 = threading.Thread(target=sub) # 启动线程 t1.start() t2.start() # 等待线程执行结束 t1.join() t2.join() print(count) ``` 在上面的示例中,我们创建了一个共享资源 count,然后分别创建了两个线程对该资源进行加和减操作。在访问共享资源的代码块前,我们使用 acquire() 方法获取锁,阻塞其他线程对该资源的访问;在访问共享资源的代码块后,我们使用 release() 方法释放锁,允许其他线程对该资源的访问。 需要注意的是,获取锁和释放锁的代码必须成对出现,否则会出现死锁等问题。此外,在使用锁进行线程同步时,应尽量避免持锁时间过长,以免影响程序的性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值