天天看點

線程安全 | 手把手教你入門Python之一百零一

上一篇: 多線程版聊天 | 手把手教你入門Python之一百 下一篇: 線程鎖的使用 | 手把手教你入門Python之一百零二 本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程 《Python入門2020最新大課》 ,主講人姜偉。

線程通路全局變量

在一個程序内的所有線程共享全局變量,很友善在多個線程間共享資料。缺點就是,線程是對全局變量随意遂改可能造成多線程之間對全局變量的混亂(即線程非安全)。

import threading
g_num = 0
def test(n):
    global g_num
    for x in range(n):
        g_num += x
        g_num -= x
    print(g_num)

if __name__ == '__main__':
    t1 = threading.Thread(target=test, args=(10,))
    t2 = threading.Thread(target=test, args=(10,))
    t1.start()
    t2.start()           

線程安全問題

import threading
import time

# 多個線程可以同時操作一個全局變量(多個線程共享全局變量)
# 線程安全問題
ticket = 20


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


t1 = threading.Thread(target=sell_ticket, name='線程1')
t2 = threading.Thread(target=sell_ticket, name='線程2')

t1.start()
t2.start()           
線程安全 | 手把手教你入門Python之一百零一
線程安全 | 手把手教你入門Python之一百零一

配套視訊