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也可以成功访问

探索完成

你可能感兴趣的:(Python多线程买票程序实践)