当前位置:首页 > 科技  > 软件

我们一起聊聊Python协程和异步编程

来源: 责编: 时间:2023-11-30 09:30:21 436观看
导读协程和异步编程是Python中处理并发和异步任务的重要概念。协程是一种轻量级的并发编程方式,它允许程序在执行过程中暂停和恢复,以便处理其他任务。异步编程模型则是基于协程的一种编程风格,它通过使用非阻塞的异步IO操作

协程和异步编程是Python中处理并发和异步任务的重要概念。协程是一种轻量级的并发编程方式,它允许程序在执行过程中暂停和恢复,以便处理其他任务。异步编程模型则是基于协程的一种编程风格,它通过使用非阻塞的异步IO操作来提高程序的并发性能。lUB28资讯网——每日最新资讯28at.com

lUB28资讯网——每日最新资讯28at.com

Python中的异步编程主要依赖于`asyncio`模块。`asyncio`提供了一套用于编写异步代码的工具和框架,包括协程、事件循环和异步IO操作等。lUB28资讯网——每日最新资讯28at.com

lUB28资讯网——每日最新资讯28at.com

代码示例:lUB28资讯网——每日最新资讯28at.com

1. 使用`async`和`await`定义协程函数:lUB28资讯网——每日最新资讯28at.com

import asyncioasync def my_coroutine():    await asyncio.sleep(1)    print("Coroutine executed")asyncio.run(my_coroutine())

2. 使用`asyncio.create_task()`并发运行多个协程:lUB28资讯网——每日最新资讯28at.com

import asyncioasync def coroutine1():    await asyncio.sleep(1)    print("Coroutine 1 executed")async def coroutine2():    await asyncio.sleep(2)    print("Coroutine 2 executed")async def main():    task1 = asyncio.create_task(coroutine1())    task2 = asyncio.create_task(coroutine2())    await asyncio.gather(task1, task2)asyncio.run(main())

3. 使用`asyncio.wait()`等待多个协程完成:lUB28资讯网——每日最新资讯28at.com

import asyncioasync def coroutine1():    await asyncio.sleep(1)    print("Coroutine 1 executed")async def coroutine2():    await asyncio.sleep(2)    print("Coroutine 2 executed")async def main():    tasks = [coroutine1(), coroutine2()]    done, pending = await asyncio.wait(tasks)    for task in done:        print(f"Task {task} completed")asyncio.run(main())

4. 使用`asyncio.Lock()`实现协程间的互斥访问:lUB28资讯网——每日最新资讯28at.com

import asyncioasync def counter(lock):    async with lock:        for _ in range(5):            print("Counting")            await asyncio.sleep(1)async def main():    lock = asyncio.Lock()    tasks = [counter(lock) for _ in range(3)]    await asyncio.gather(*tasks)asyncio.run(main())

5. 使用`asyncio.Queue()`实现协程间的消息传递:lUB28资讯网——每日最新资讯28at.com

import asyncioasync def producer(queue):    for i in range(5):        await queue.put(i)        print(f"Produced: {i}")        await asyncio.sleep(1)async def consumer(queue):    while True:        item = await queue.get()        print(f"Consumed: {item}")        await asyncio.sleep(2)async def main():    queue = asyncio.Queue()    producer_task = asyncio.create_task(producer(queue))    consumer_task = asyncio.create_task(consumer(queue))    await asyncio.gather(producer_task, consumer_task)asyncio.run(main())

6. 使用`asyncio.TimeoutError`设置协程的超时:lUB28资讯网——每日最新资讯28at.com

import asyncioasync def my_coroutine():    await asyncio.sleep(2)    print("Coroutine executed")async def main():    try:        await asyncio.wait_for(my_coroutine(), timeout=1)    except asyncio.TimeoutError:        print("Coroutine timed out")asyncio.run(main())

7. 使用`asyncio.run_in_executor()`在协程中执行阻塞的同步操作:lUB28资讯网——每日最新资讯28at.com

import asynciodef sync_operation():    # 阻塞的同步操作    return "Sync result"async def main():    loop = asyncio.get_running_loop()    result = await loop.run_in_executor(None, sync_operation)    print(f"Result: {result}")asyncio.run(main())

8. 使用`aiohttp`库进行异步HTTP请求:lUB28资讯网——每日最新资讯28at.com

import asyncioimport aiohttpasync def fetch_data(url):    async with aiohttp.ClientSession() as session:        async with session.get(url) as response:            return await response.text()async def main():    url = "https://api.example.com/data"    data = await fetch_data(url)    print(f"Data: {data}")asyncio.run(main())

9. 使用`asyncio.sleep()`模拟异步计时器:lUB28资讯网——每日最新资讯28at.com

import asyncioasync def timer(duration):    await asyncio.sleep(duration)    print(f"Timer finished after {duration} seconds")async def main():    tasks = [timer(1), timer(2), timer(3)]    await asyncio.gather(*tasks)asyncio.run(main())

10. 使用`asyncio`实现并发的文件IO操作:lUB28资讯网——每日最新资讯28at.com

import asyncioasync def read_file(file):    async with asyncio.open_file(file, "r") as f:        contents = await f.read()        print(f"Read from {file}: {contents}")async def write_file(file, data):    async with asyncio.open_file(file, "w") as f:        await f.write(data)        print(f"Wrote to {file}")async def main():    file = "data.txt"    await write_file(file, "Hello, world!")    await read_file(file)asyncio.run(main())

lUB28资讯网——每日最新资讯28at.com

这些场景代码展示了协程和异步编程的使用方式。通过使用`asyncio`模块和相关的工具,我们可以轻松地编写并发和异步任务处理的代码,提高程序的性能和响应能力。lUB28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-35336-0.html我们一起聊聊Python协程和异步编程

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 优雅的springboot参数校验,你学会了吗?

下一篇: 揭秘Git高手的十个秘密武器:让你的工作效率飙升!

标签:
  • 热门焦点
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top