美文网首页python自学
Python多线程买票程序实践

Python多线程买票程序实践

作者: 一脑两输出 | 来源:发表于2019-08-02 14:18 被阅读3次

【背景】
模拟卖票程序,50个窗口同时卖5000张票
从中可以观察5000张票的临界资源怎么被争夺

from threading import Thread,Lock
import time
num=5000
#卖票程序
def sale(i):
    global num
    while num>0:
        #mylock.acquire()
        num-=1
        print('num='+str(num),i)
       # mylock.release()
t=[]
#mylock=Lock()
for i in range(50):
#创建线程
    t1=Thread(target=sale,args=(i,))
    t.append(t1)

for thread in t:
#多线程启动
    thread.start()

【运行结果】

运行结果很奇怪,并没有出现一票多卖的情况


随意截图

多个线程写同一变量不会出现问题吗?
那为什么还要上锁?
这让我对之前学到的线程同步互斥机制产生怀疑

【修改程序】
考虑到num-=1可能是一个原子操作(猜测),或者根本就是因为程序运行的太快了,增加时延:
每次num-=1之后,延时0.01秒,即time.sleep(0.01)


结果

这次出现了一票多卖的情况!我的理解是sleep()函数会让当前线程被挂起,这就给了其他线程重复写的机会。

但是注意:
时延一定要放在num-=1之后,原因也可以推测,只有在修改了num值之后再时延才会出现写未发生的机制,否则一台PC不能模拟出多台终端同时访问的情况

【防止重复写】
Python程序上锁

 while num>0:
        mylock.acquire()
        num-=1
        time.sleep(0.001)
        print('num='+str(num),i)
        mylock.release()
mylock=Lock()

在外面的主线程上创建一个锁对象,这次,我们即使有了sleep也可以成功访问

探索完成🆗

相关文章

  • Python多线程买票程序实践

    【背景】模拟卖票程序,50个窗口同时卖5000张票从中可以观察5000张票的临界资源怎么被争夺 【运行结果】 运行...

  • 多线程、多进程、池化

    python程序默认单核线性执行程序,为更高效利用计算机的多核、多线程能力,python搭建了多线程、多进程的机制...

  • Python程序员都知道的入门知识の八

    目录【Python程序员都知道的入门知识】 1. 多线程threading、Queue Python的多线程由th...

  • Python多线程

    Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序...

  • 《莫烦Python3基础教程》学习笔记3

    一.Threading 多线程 1.什么是多线程 多线程是加速程序计算的有效方式,Python的多线程模块thre...

  • python线程的实现,线程池

    python通过标准库threading实现多线程的运行。程序的运行总要考虑并发,并行数。在多线程程序中为了确保程...

  • GIL(全局解释器锁)

    GIL面试题如下 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序...

  • GIL 全局解释器锁

    GIL面试题如下 描述Python GIL概念,以及它对Python多线程的影响?在一个多线程抓取网页的程序中,多...

  • Python 主线程捕获子线程异常

    多线程异常 接上一篇Python手动中断(Ctrl-C)多线程程序,这一篇来探讨多线程程序中另一个问题:主线程捕获...

  • 多线程 买票

网友评论

    本文标题:Python多线程买票程序实践

    本文链接:https://www.haomeiwen.com/subject/jqwfdctx.html