Python 中的同步\异步

发布时间:2026/9/3 14:58:26
Python 中的同步\异步 一、相关概念概念解释区别并发多个任务交替执行看起来像同时逻辑上的同时并行多个任务真正同时执行物理上的同时同步任务按顺序执行一个等一个阻塞等待异步任务不等待做完再通知非阻塞二、并发 vs 并行示例import threading import time # 并发单核CPU快速切换 def concurrency_demo(): def task(name): for i in range(3): print(f{name}: {i}) time.sleep(0.1) t1 threading.Thread(targettask, args(A,)) t2 threading.Thread(targettask, args(B,)) t1.start() t2.start() t1.join() t2.join() # 输出交替出现A0, B0, A1, B1, A2, B2 # 并行多核CPU真正同时执行 # Python 由于 GIL多线程无法真正并行需要用多进程 from multiprocessing import Pool def parallel_demo(): def square(x): return x * x with Pool(4) as p: # 4个进程并行 result p.map(square, range(10)) print(result)区别维度并发并行核心数单核或多核必须多核执行方式交替执行同时执行Python 支持线程、协程多进程GIL 影响线程受 GIL 限制进程不受 GIL 限制三、同步 vs 异步示例import asyncio import time # 同步 def sync_task(): print(开始下载) time.sleep(2) # 模拟耗时 I/O阻塞等待 print(下载完成) return data def sync_demo(): print(同步开始) result sync_task() # 等待 2 秒 print(继续执行) print(f结果: {result}) # 异步 async def async_task(): print(开始下载) await asyncio.sleep(2) # 非阻塞让出控制权 print(下载完成) return data async def async_demo(): print(异步开始) task asyncio.create_task(async_task()) print(继续执行不等待下载完成) result await task # 等结果就绪再获取 print(f结果: {result}) # 运行异步 # asyncio.run(async_demo())同步输出同步开始 开始下载 [等待 2 秒] 下载完成 继续执行 结果: data异步输出异步开始 开始下载 继续执行不等待下载完成 [等待 2 秒后] 下载完成 结果: data区别维度同步异步等待方式阻塞等待非阻塞等待资源利用等待时浪费 CPU等待时可以做其他事编程复杂度简单相对复杂适用场景简单脚本、CPU 密集型I/O 密集型、高并发四、实现方式场景推荐方案说明并发I/O密集型asyncio、threading协程最优线程次之并行CPU密集型multiprocessing绕过 GIL同步普通函数调用最简单异步async/await需要事件循环示例import asyncio import time from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor # 模拟 I/O 操作 async def io_task(name): print(f{name}: 开始 I/O) await asyncio.sleep(1) # 模拟网络请求 print(f{name}: I/O 完成) return f{name} 结果 # 模拟 CPU 密集型任务 def cpu_task(n): return sum(i * i for i in range(n)) # 异步并发协程 async def async_concurrent(): tasks [io_task(f任务{i}) for i in range(5)] results await asyncio.gather(*tasks) print(f异步并发结果: {results}) # 多进程并行 def parallel(): with ProcessPoolExecutor() as executor: results list(executor.map(cpu_task, [10**7] * 4)) print(f并行计算耗时: {time.time() - t:.2f}s)