尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python 线程同步与异步编程 全解析

Python 线程同步与异步编程 全解析 目录Python 线程同步与异步编程 全解析一、线程同步(多线程场景)1. 为什么需要线程同步?2. 常用线程同步工具(附代码示例)(1)互斥锁 Lock(最常用)(2)可重入锁 RLock(3)条件变量 Condition(4)信号量 Semaphore(5)事件 Event二、Python 异步编程(asyncio)1. 异步核心原理2. 核心关键字3. 基础示例4. 异步 vs 多线程 核心对比三、适用场景总结Python 线程同步与异步编程 全解析先给核心概念大白话比喻,彻底搞懂同步、异步、多线程的区别:同步:排队执行,一个任务完全结束后,下一个任务才能开始,全程按顺序来,不会穿插。异步:任务穿插执行,一个任务遇到「等待 / 阻塞」(比如等网络请求、等文件读写)时,先把 CPU 让给其他任务,等阻塞结束再回来继续执行,不用干等。线程同步:多线程场景下,为了避免多个线程同时操作共享数据导致出错,加锁让线程排队访问共享资源,保证数据安全。异步编程:单线程内的并发方案,靠「协程 + 事件循环」实现任务切换,不用开多线程,就能处理多个 IO 密集型任务。一、线程同步(多线程场景)1. 为什么需要线程同步?多线程场景下,多个线程会同时操作同一份共享数据,如果不加控制,会出现「数据竞争」,导致结果错误、数据混乱。经典的「卖票超卖」问题示例(无同步的错误场景):pythonimport threading import time # 共享数据:总票数 ticket = 10 def sell_ticket(): global ticket while ticket 0: # 模拟卖票的IO操作 time.sleep(0.1) ticket -= 1 print(f"线程{threading.current_thread().name} 卖出1张票,剩余{ticket}张") # 开启3个卖票线程 for i in range(3): t = threading.Thread(target=sell_ticket, name=f"售票员{i+1}") t.start()错误结果:会出现剩余票数为负数、多个线程卖出同一张票的情况,因为多个线程同时读取了ticket=1,都执行了ticket-=1。2. 常用线程同步工具(附代码示例)(1)互斥锁Lock(最常用)核心作用:保证同一时间只有一个线程能获取到锁,只有获取到锁的线程能执行临界区代码(操作共享数据的代码),其他线程会阻塞等待。核心方法:acquire()获取锁、release()释放锁,推荐用with语句自动管理锁(避免忘记释放导致死锁)。pythonimport threading import time ticket = 10 # 创建锁对象 lock = threading.Lock() def sell_ticket(): global ticket while True: # 1. 获取锁:如果锁被其他线程占用,当前线程阻塞等待 lock.acquire() # 2. 临界区:操作共享数据,只有获取到锁的线程能执行 if ticket 0: time.sleep(0.1) tick
返回列表