資安

線程安全

本文來自於千鋒教育在阿里雲開發者社區學習中心上線課程《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()

image.png
image.png

配套視頻

Leave a Reply

Your email address will not be published. Required fields are marked *