开发者学堂课程【Python入门 2020年版:多线程共享全局变量&;线程安全问题】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10467
多线程共享全局变量&;线程安全问题
内容介绍
一、多线程共享全局变量
二、线程安全问题
一、多线程共享全局变量
1.多线程开发
单线程:
ticket=100
def sell_ticket ():
global ticket
While True:
if ticket > 0:
ticket -= 1
print
('{}卖出一张票,还剩{}张'. format(ticket))
else:
print
('票卖完了')
break
Sell_ticket()
2.死循环买票,接着加上time.sleep(1)买票变慢了,卖一张等一秒,这是单线程买票:
ticket=100
def sell_ticket ():
global ticket
While True:
if ticket > 0:
time.sleep(1)
ticket -= 1
print
('{}卖出一张票,还剩{}张'. format(ticket))
else:
print
('票卖完了')
break
Sell_ticket()
3.接下来来个多线程买票:
ticket=20
def sell_ticket ():
global ticket
While True:
if ticket > 0:
time.sleep(1)
ticket -= 1
print
('{}卖出一张票,还剩{}张'.
format(threading.current_thread().name,ticket))
else:
print
('票卖完了')
break
t1=threading.Thread(target=sell_ticket
,
name=‘线程1’)
t2=threading.Thread(target=sell_ticket
,
name=‘线程2’)
t1.start()
t2.start()
现在有两个线程在买,当一个歇一秒的时候另一个在卖,多窗口一起买票,效率高。大家会发现一个问题,线程1线程2 都访问同一个变量ticket。
怎么卖的:
线程1卖出一张票,还剩19张
线程2卖出一张票,还剩18张
......
线程1卖出一张票,还剩1张
线程2卖出一张票,还剩0张
票卖完了
线程1卖出一张票,还剩-1张
票卖完了
二、线程安全问题
多个线程可以同时操作一个全局变量(多个线程共享全局变量)
可以发现出现问题票买完后出现-1张,这是线程安全问题。歇的足够久就会出现该问题,一秒可以切换好几回了。
def sell_ticket ():
global ticket
While True:
#ticket=1 线程1:1 线程2:1
if ticket > 0:
time.sleep(1)
#线程1:ticket=1 线程2:ticket=1
ticket -= 1
#线程1:ticket=0线程2:ticket=-1
print
('{}卖出一张票,还剩{}张'.
format(threading.current_thread().name,ticket))
else:
print
('票卖完了')
Break
讲解(看标注#):
Ticket1先进来票还剩一张,满足,它在这等着,还没来得及改剩余票数,线程2进来发现也满足也等,线程1先进来,线程1先醒,醒了就改成票数为0了,之后线程2也醒了就把0改成了-1。