Python多线程买票程序实践

【背景】
模拟卖票程序,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也可以成功访问

探索完成🆗

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、线程介绍 1.1、线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最...
    IIronMan阅读 5,139评论 0 2
  • 线程 1.同步概念 1.多线程开发可能遇到的问题 同步不是一起的意思,是协同步调 假设两个线程t1和t2都要对nu...
    TENG书阅读 3,798评论 0 1
  • 多任务可以由多进程完成,也可以由一个进程内的多线程完成。我们前面提到了进程是由若干线程组成的,一个进程至少有一个线...
    壁花烧年阅读 4,235评论 0 0
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,094评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,200评论 1 15

友情链接更多精彩内容