Python多线程售票模拟:从竞态条件到锁机制实现

程一诺
程一诺
发布时间:2026-10-14 | 4人浏览过
原创

本文通过Python多线程模拟火车站售票场景,深入解析多线程环境下的竞态条件问题。首先展示未加锁时可能卖出重复或无效票的现象,随后引入threading.Lock锁机制,利用try...finally确保锁释放,实现线程安全的售票逻辑。

Python多线程售票模拟概述

本文通过具体代码实例,演示如何使用Python多线程技术模拟火车站售票过程,供读者参考学习。

在Python标准库中,提供了thread和threading两个并发模块。其中thread属于底层模块,而threading则是基于thread封装的高级模块,提供了更便捷的接口。

无锁情况下的竞态问题分析

本文采用threading模块进行开发,首先演示在缺乏同步机制的情况下,多线程同时操作共享资源可能导致卖出同一张票的异常现象。


import threading 
from time import sleep, ctime
 
 
N = 100  # 100张票
 
def Sell(name):
     global N
 
     while True:
         if N>0:
            sleep(0.1)  #加入此句,可以让线程卖出第0张票或同一张票
            print("{}卖出第{}张票!\n".format(name,N))
            N=N-1
 
def main():
 
    threads = {}
 
    for i in ( "A" ,"B"  ):
        # 实例化每个 Thread 对象,把函数和参数传递进去,返回 Thread 实例
        t = threading.Thread(target=Sell, args=( i  ,))
        threads[i]=t     # 分配线程
 
    for i in  ("A" ,"B"):
        threads[i].start()    # 开始执行多线程
 
    for i in  ("A" ,"B"):
        threads[i].join()     # 等待线程结束或超时,然后再往下执行
 
    print("程序结束!")
 
 
if __name__ == '__main__':
    main()

上述代码的运行结果如下所示:

基于Lock锁机制的线程安全实现

为解决上述问题,引入锁机制来确保售票的唯一性。当多个线程同时尝试执行lock.acquire()时,仅有一个线程能成功获取锁并继续执行后续代码,其余线程则处于等待状态,直到持有锁的线程释放锁。代码中采用try...finally结构,旨在确保无论执行过程是否发生异常,锁最终都能被正确释放。


import threading
from time import sleep, ctime
 
N = 100  # 100张票
 
lock = threading.Lock()
 
def Sell(name):
 
     global N
 
     while True:
 
         lock.acquire()
         try:
            if N>0:
             sleep(0.1)  #加入此句,可以让线程卖出第0张票或同一张票
             print("{}卖出第{}张票!\n".format(name,N))
             N=N-1
         finally:
             # 改完了一定要释放锁:
             lock.release()
 
def main():
 
    threads = {}
 
    for i in ( "A" ,"B"  ):
        # 实例化每个 Thread 对象,把函数和参数传递进去,返回 Thread 实例
        t = threading.Thread(target=Sell, args=( i  ,))
        threads[i]=t     # 分配线程
 
    for i in  ("A" ,"B"):
        threads[i].start()    # 开始执行多线程
 
    for i in  ("A" ,"B"):
        threads[i].join()     # 等待线程结束或超时,然后再往下执行
 
    print("程序结束!")
 
 
if __name__ == '__main__':
    main()

加入锁机制后的运行效果如下:

以上内容涵盖了Python多线程售票模拟的核心实现与注意事项,希望对读者理解并发编程有所帮助,欢迎继续支持本站获取更多技术内容。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表