线程安全 | 手把手教你入门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()

image.png
image.png

配套视频

相关文章
|
1天前
|
Python 索引 C语言
Python3从零基础到入门(2)—— 运算符-3
Python3从零基础到入门(2)—— 运算符
|
1天前
|
NoSQL 测试技术 API
Python 入门指南(七)(4)
Python 入门指南(七)
9 0
|
1天前
|
测试技术 程序员 数据库
Python 入门指南(七)(3)
Python 入门指南(七)
7 0
|
1天前
|
存储 设计模式 程序员
Python 入门指南(七)(2)
Python 入门指南(七)
9 1
|
1天前
|
XML 算法 uml
Python 入门指南(七)(1)
Python 入门指南(七)
8 0
|
1天前
|
机器学习/深度学习 存储 算法
Python 入门指南(六)(4)
Python 入门指南(六)
6 1
|
1天前
|
设计模式 存储 安全
Python 入门指南(六)(3)
Python 入门指南(六)
9 0
|
1天前
|
存储 缓存 索引
Python 入门指南(六)(2)
Python 入门指南(六)
8 1
|
1天前
|
存储 缓存 程序员
Python 入门指南(六)(1)
Python 入门指南(六)
8 1
|
1天前
|
存储 程序员 API
Python 入门指南(五)(4)
Python 入门指南(五)
11 1