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

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

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

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

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

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

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

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

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

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

2. 使用`asyncio.create_task()`并发运行多个协程:xEb28资讯网——每日最新资讯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()`等待多个协程完成:xEb28资讯网——每日最新资讯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()`实现协程间的互斥访问:xEb28资讯网——每日最新资讯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()`实现协程间的消息传递:xEb28资讯网——每日最新资讯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`设置协程的超时:xEb28资讯网——每日最新资讯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()`在协程中执行阻塞的同步操作:xEb28资讯网——每日最新资讯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请求:xEb28资讯网——每日最新资讯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()`模拟异步计时器:xEb28资讯网——每日最新资讯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操作:xEb28资讯网——每日最新资讯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())

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

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

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

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

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

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

标签:
  • 热门焦点
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • 服务存储设计模式:Cache-Aside模式

    服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 让我们一起聊聊文件的操作

    让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 在线图片编辑器,支持PSD解析、AI抠图等

    在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 信通院:小米、华为等11家应用商店基本完成APP签名及验签工作

    信通院:小米、华为等11家应用商店基本完成APP签名及验签工作

    中国信通院表示,目前,小米、华为、OPPO、vivo、360手机助手、百度手机助手、应用宝、豌豆荚和努比亚等9家应用商店,以及抖音和快手2家新型应用分发平
Top