法律大模型如何提升司法文书处理效率
2026/7/25 20:03:29
pythonimport timedef read_file_sync(filename): """同步读取文件的模拟函数""" print(f"开始读取 {filename}") time.sleep(2) # 模拟 IO 等待(2秒) print(f"完成读取 {filename}") return f"{filename} 的内容"def main_sync(): start = time.time() # 顺序执行,每个任务都会阻塞 result1 = read_file_sync("文件A.txt") result2 = read_file_sync("文件B.txt") result3 = read_file_sync("文件C.txt") print(f"总耗时: {time.time() - start:.2f}秒") print(f"结果: {result1}, {result2}, {result3}")main_sync()# 输出:# 开始读取 文件A.txt# 完成读取 文件A.txt# 开始读取 文件B.txt# 完成读取 文件B.txt# 开始读取 文件C.txt# 完成读取 文件C.txt# 总耗时: 6.00秒在这个例子中,虽然 CPU 在time.sleep()期间没有做任何有用工作,但它被迫等待。3个文件需要6秒,效率极其低下。### 异步的妙:CPU 忙个不停现在,让我们看看异步版本如何解决这个问题:pythonimport asyncioimport timeasync def read_file_async(filename): """异步读取文件的模拟函数""" print(f"开始读取 {filename}") await asyncio.sleep(2) # 异步等待,不阻塞 print(f"完成读取 {filename}") return f"{filename} 的内容"async def main_async(): start = time.time() # 并发执行三个任务 tasks = [ read_file_async("文件A.txt"), read_file_async("文件B.txt"), read_file_async("文件C.txt") ] # 等待所有任务完成 results = await asyncio.gather(*tasks) print(f"总耗时: {time.time() - start:.2f}秒") print(f"结果: {results}")# 运行异步主函数asyncio.run(main_async())# 输出:# 开始读取 文件A.txt# 开始读取 文件B.txt# 开始读取 文件C.txt# 完成读取 文件A.txt# 完成读取 文件B.txt# 完成读取 文件C.txt# 总耗时: 2.00秒关键差异:异步版本只用了2秒就完成了3个任务!这是因为当任务A在等待时,事件循环立即切换到任务B和C,CPU一直在处理有用工作。## 深入理解事件循环机制### 事件循环的核心原理事件循环是异步编程的调度中心,它的工作流程如下:1.任务队列:维护一个待执行的任务列表2.轮询检查:不断检查是否有任务可以执行3.暂停与恢复:遇到await时暂停当前任务,切换到其他任务4.回调触发:当 IO 操作完成时,通知事件循环恢复对应任务### 实战:用代码模拟事件循环pythonimport asyncioimport randomclass SimpleEventLoop: """简化版事件循环演示""" def __init__(self): self.tasks = [] self.running = True def add_task(self, coro): self.tasks.append(coro) async def run(self): """模拟事件循环的调度过程""" while self.tasks: # 从任务队列取下一个任务 current_task = self.tasks.pop(0) try: # 执行任务直到遇到 await await current_task print("任务完成,回到事件循环") except Exception as e: print(f"任务出错: {e}") # 模拟检查是否有新任务加入 if random.random() < 0.3: print("事件循环:检测到新任务加入!")async def demo_task(task_id, delay): """模拟一个异步任务""" print(f"任务{task_id}:开始执行") await asyncio.sleep(delay) # 模拟 IO 操作 print(f"任务{task_id}:执行完毕,耗时{delay}秒") return task_idasync def main(): loop = SimpleEventLoop() # 创建多个异步任务 tasks = [ demo_task(1, 2), demo_task(2, 1), demo_task(3, 3) ] print("=== 事件循环开始调度 ===") for task in tasks: loop.add_task(task) await loop.run() print("=== 所有任务完成 ===")asyncio.run(main())## 异步编程的最佳实践### 1. 识别适合异步的场景-IO 密集型任务:网络请求、文件读写、数据库查询-不适合:CPU 密集型计算(如复杂数学运算)### 2. 避免阻塞事件循环python# 错误示例:使用 time.sleep() 会阻塞事件循环async def bad_example(): time.sleep(5) # 阻塞!所有任务都要等 return "done"# 正确示例:使用 asyncio.sleep()async def good_example(): await asyncio.sleep(5) # 非阻塞,事件循环可以处理其他任务 return "done"### 3. 合理控制并发数量pythonimport asyncioasync def limited_concurrency(): """使用 Semaphore 控制并发数量""" semaphore = asyncio.Semaphore(10) # 最多同时处理10个任务 async def task_with_limit(task_id): async with semaphore: print(f"任务{task_id}:获取到执行权限") await asyncio.sleep(1) return task_id tasks = [task_with_limit(i) for i in range(100)] results = await asyncio.gather(*tasks) print(f"完成{len(results)}个任务")asyncio.run(limited_concurrency())## 总结异步编程通过事件循环机制,实现了任务的高效调度,最大化 CPU 利用率。它的核心优势在于:-非阻塞等待:在等待 IO 操作时释放 CPU 资源-高效切换:事件循环在微秒级别完成任务切换-资源节约:相比多线程,无需大量内存管理线程在实际开发中,异步编程特别适合 Web 服务器、API 调用、微服务架构等 IO 密集型场景。掌握异步编程,就像给你的程序装上了"多任务处理"引擎,让 CPU 不再空转,真正实现"忙个不停"的高效运行。记住:异步不是魔法,而是让等待变得有价值的艺术。