2026/2/16 1:33:15
网站建设
项目流程
led的网站建设,wordpress删除缓存,零基础自己做网站,新版wordpress没有关键词Python协程使用详解
协程#xff08;Coroutine#xff09;是Python中实现并发编程的一种重要方式#xff0c;它比线程更轻量级#xff0c;适合I/O密集型任务。下面我通过几个例子来详细讲解。
1. 基础概念
协程通过 async/await 语法实现#xff0c;主要特点#xff1a;
…Python协程使用详解协程Coroutine是Python中实现并发编程的一种重要方式它比线程更轻量级适合I/O密集型任务。下面我通过几个例子来详细讲解。1. 基础概念协程通过async/await语法实现主要特点使用async def定义协程函数使用await挂起协程执行需要事件循环event loop来运行2. 基础示例示例1最简单的协程importasyncio# 定义协程函数asyncdefhello():print(Hello)awaitasyncio.sleep(1)# 模拟I/O操作print(World)# 运行协程asyncio.run(hello())示例2多个协程顺序执行importasyncioasyncdeftask1():print(开始任务1)awaitasyncio.sleep(2)print(完成任务1)return结果1asyncdeftask2():print(开始任务2)awaitasyncio.sleep(1)print(完成任务2)return结果2asyncdefmain():# 顺序执行result1awaittask1()result2awaittask2()print(f结果:{result1},{result2})asyncio.run(main())3. 并发执行协程示例3使用asyncio.gather并发运行importasyncioasyncdefdownload(url,seconds):print(f开始下载{url})awaitasyncio.sleep(seconds)# 模拟下载时间print(f完成下载{url})returnf{url}的内容asyncdefmain():# 创建多个任务并发执行tasks[download(http://example.com/page1,3),download(http://example.com/page2,2),download(http://example.com/page3,1)]# 并发执行所有任务resultsawaitasyncio.gather(*tasks)print(所有下载完成:,results)asyncio.run(main())示例4使用asyncio.create_taskimportasyncioasyncdefprocess_data(data_id,processing_time):print(f开始处理数据{data_id})awaitasyncio.sleep(processing_time)print(f完成处理数据{data_id})returnf处理后的数据{data_id}asyncdefmain():# 创建任务但不立即等待task1asyncio.create_task(process_data(1,2))task2asyncio.create_task(process_data(2,1))task3asyncio.create_task(process_data(3,3))# 在需要的时候等待结果result1awaittask1 result2awaittask2 result3awaittask3print(f结果:{result1},{result2},{result3})asyncio.run(main())4. 协程间通信示例5使用asyncio.Queueimportasyncioimportrandomasyncdefproducer(queue,producer_id):foriinrange(3):itemf产品{producer_id}-{i}awaitasyncio.sleep(random.random())# 模拟生产时间awaitqueue.put(item)print(f生产者{producer_id}生产了:{item})awaitqueue.put(None)# 结束信号asyncdefconsumer(queue,consumer_id):whileTrue:itemawaitqueue.get()ifitemisNone:queue.put(None)# 将结束信号放回队列供其他消费者使用breakawaitasyncio.sleep(random.random()*2)# 模拟消费时间print(f消费者{consumer_id}消费了:{item})queue.task_done()asyncdefmain():queueasyncio.Queue(maxsize5)# 创建生产者和消费者producers[asyncio.create_task(producer(queue,i))foriinrange(2)]consumers[asyncio.create_task(consumer(queue,i))foriinrange(3)]# 等待所有生产者完成awaitasyncio.gather(*producers)# 等待队列中的所有项目被消费awaitqueue.join()# 取消消费者任务forcinconsumers:c.cancel()asyncio.run(main())5. 实际应用示例示例6并发HTTP请求importaiohttpimportasyncioimporttimeasyncdeffetch_url(session,url):try:asyncwithsession.get(url,timeout10)asresponse:dataawaitresponse.text()returnf{url}: 状态码{response.status}, 长度{len(data)}exceptExceptionase:returnf{url}: 错误 -{str(e)}asyncdefmain():urls[https://httpbin.org/get,https://httpbin.org/delay/2,# 延迟2秒的端点https://httpbin.org/status/404,https://httpbin.org/status/500]start_timetime.time()asyncwithaiohttp.ClientSession()assession:tasks[fetch_url(session,url)forurlinurls]resultsawaitasyncio.gather(*tasks)forresultinresults:print(result)end_timetime.time()print(f\n总耗时:{end_time-start_time:.2f}秒)asyncio.run(main())示例7带超时控制的协程importasyncioasyncdeflong_running_task(task_id,seconds):print(f任务{task_id}开始)awaitasyncio.sleep(seconds)print(f任务{task_id}完成)returnf任务{task_id}结果asyncdefmain():try:# 设置超时时间为3秒resultawaitasyncio.wait_for(long_running_task(1,5),timeout3)print(f成功:{result})exceptasyncio.TimeoutError:print(任务超时)# 使用asyncio.shield防止取消try:taskasyncio.create_task(long_running_task(2,4))# shield保护任务不被取消resultawaitasyncio.wait_for(asyncio.shield(task),timeout2)print(fshield结果:{result})exceptasyncio.TimeoutError:print(外部超时但任务继续运行)# 等待被shield的任务完成resultawaittaskprint(f被shield的任务最终完成:{result})asyncio.run(main())6. 协程模式示例示例8生产者-消费者模式importasyncioimportrandomasyncdefproducer(name,queue):foriinrange(5):itemfitem-{name}-{i}awaitasyncio.sleep(random.uniform(0.1,0.5))awaitqueue.put(item)print(f{name}生产了{item})asyncdefconsumer(name,queue):whileTrue:try:# 设置超时避免永远等待itemawaitasyncio.wait_for(queue.get(),timeout2)awaitasyncio.sleep(random.uniform(0.2,0.8))# 模拟处理时间print(f{name}处理了{item})queue.task_done()exceptasyncio.TimeoutError:print(f{name}等待超时退出)breakasyncdefmain():queueasyncio.Queue(maxsize3)# 创建生产者和消费者producers[asyncio.create_task(producer(fP{i},queue))foriinrange(2)]consumers[asyncio.create_task(consumer(fC{i},queue))foriinrange(3)]# 等待所有生产者完成awaitasyncio.gather(*producers)# 等待队列清空awaitqueue.join()# 取消消费者forcinconsumers:c.cancel()print(所有任务完成)asyncio.run(main())关键要点总结定义协程: 使用async def定义协程函数调用协程: 使用await调用其他协程运行协程: 使用asyncio.run()运行顶级协程并发执行: 使用asyncio.gather()或asyncio.create_task()实现并发协程通信: 使用asyncio.Queue进行协程间通信错误处理: 协程中可以使用常规的try/except处理异常超时控制: 使用asyncio.wait_for()设置超时协程适合I/O密集型应用如网络请求、文件读写等场景可以显著提高程序的并发性能。