Python中的并发编程:asyncio库入门

反射流沙
• 阅读 554

Python中的并发编程允许你同时执行多个任务,提高程序的运行效率。在本文中,我们将介绍Python中的asyncio库,它是一个基于异步I/O的并发编程库,用于编写高性能的网络和并发代码。

1. 为什么要使用asyncio?

在传统的同步编程模型中,程序执行一个任务,直到它完成,然后才能执行下一个任务。而在异步编程模型中,当一个任务在等待I/O操作时(例如读取文件或网络请求),程序可以切换到其他任务执行。这样可以提高程序的执行效率,因为CPU不再被阻塞在等待I/O操作上。

asyncio提供了一个基于事件循环的异步编程模型,允许你使用asyncawait关键字编写异步代码。asyncio还提供了许多高级功能,如并发、任务、协程、异步I/O操作等。

2. 使用asyncio创建一个简单的异步程序

以下是一个简单的异步程序示例,它使用asyncio库创建了一个异步任务:

import asyncio

async def hello_world():
    print("Hello World!")
    await asyncio.sleep(1)
    print("Hello again!")

async def main():
    task = asyncio.ensure_future(hello_world())
    await task

asyncio.run(main())

在这个示例中,我们定义了一个hello_world协程,并在main协程中调用它。我们使用asyncio.run()函数启动事件循环,执行main协程。

3. 使用asyncio.gather()运行多个协程

当你需要同时运行多个协程时,可以使用asyncio.gather()函数。这个函数会等待所有协程完成,然后返回一个包含所有协程返回值的列表。

以下是一个示例,展示如何使用asyncio.gather()同时运行多个协程:

import asyncio

async def task1():
    print("Task 1 started")
    await asyncio.sleep(2)
    print("Task 1 finished")
    return "Task 1 result"

async def task2():
    print("Task 2 started")
    await asyncio.sleep(1)
    print("Task 2 finished")
    return "Task 2 result"

async def main():
    results = await asyncio.gather(task1(), task2())
    print(results)

asyncio.run(main())

在这个示例中,我们定义了两个协程task1task2,并在main协程中使用asyncio.gather()函数同时运行它们。输出结果显示task1task2是并发执行的。

4. 小结

Python的asyncio库提供了一个强大的异步编程模型,帮助你编写高性能的网络和并发代码。本文简要介绍了如何使用asyncio创建简单的异步程序,以及如何使用asyncio.gather()同时运行多个协程。通过掌握asyncio的基本概念和使用方法,你可以为你的Python项目带来显著的性能提升。

5. asyncio中的其他功能

此外,asyncio还提供了一些其他功能,例如创建TCP和UDP服务器、调度协程和任务等。以下是一些你可能会在实际项目中使用到的asyncio功能:

5.1 创建TCP服务器

以下是一个使用asyncio创建简单TCP服务器的示例:

import asyncio

async def handle_client(reader, writer):
    data = await reader.read(100)
    message = data.decode()
    print(f"Received: {message}")

    response = "Hello, client!"
    writer.write(response.encode())
    await writer.drain()

    writer.close()

async def main():
    server = await asyncio.start_server(handle_client, "127.0.0.1", 8080)

    async with server:
        await server.serve_forever()

asyncio.run(main())

5.2 调度协程和任务

你可以使用asyncio.create_task()asyncio.ensure_future()函数创建任务,并使用asyncio.wait()asyncio.gather()函数等待任务完成。

import asyncio

async def foo():
    print("Start foo")
    await asyncio.sleep(1)
    print("End foo")

async def bar():
    print("Start bar")
    await asyncio.sleep(2)
    print("End bar")

async def main():
    task1 = asyncio.create_task(foo())
    task2 = asyncio.create_task(bar())

    await asyncio.gather(task1, task2)

asyncio.run(main())

6. 总结

Python的asyncio库为我们提供了强大的异步编程功能,使我们能够编写更高效的并发程序。我们已经介绍了如何使用asyncio创建简单的异步程序、运行多个协程、创建TCP服务器以及调度协程和任务等。通过学习和实践这些功能,你将能够更好地利用Python的并发编程能力,提高你的程序性能。

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
Gevent简明教程
1、前述进程线程协程异步并发编程(不是并行)目前有四种方式:多进程、多线程、协程和异步。多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库多线程编程python中有Thread和threading异步编程在linux下主要有三种实现selec
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Python异步Web编程
!(https://oscimg.oschina.net/oscnet/c170345b07b2bf0b8c076ee4350fe145ad0.jpg)异步编程适用于那些频繁读写文件和频繁与服务器交互数据的任务,异步程序以非阻塞的方式执行I/O操作。这样意味着程序可以在等待客户机返回数据的同时执行其他任务,而不是无所事事的等待,浪费资源和时间。
Stella981 Stella981
3年前
Python asyncio 与 aiohttp 使用简单记录
asyncio的基本概念asyncio是在python3.4中被引进的异步IO库。你也可以通过python3.3的pypi来安装它。它相当的复杂,而且我不会介绍太多的细节。相反,我将会解释你需要知道些什么,以利用它来写异步的代码。简而言之,有两件事情你需要知道:协同程序和事件循环。协同程序像是方法,但是它们可以在代码中的特定点暂停和继
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
使用asyncio库和多线程实现高并发的异步IO操作的爬虫
摘要:本文介绍了如何使用Python的asyncio库和多线程实现高并发的异步IO操作,以提升爬虫的效率和性能。通过使用asyncio的协程和事件循环,结合多线程,我们可以同时处理多个IO任务,并实现对腾讯新闻网站的高并发访问。正文:在网络爬虫中,IO操作
异步爬虫实战:实际应用asyncio和aiohttp库构建异步爬虫
在网络爬虫的开发中,异步爬虫已经成为一种非常流行的技术。它能够充分利用计算机的资源,提高爬虫效率,并且能够处理大量的运算请求。Python中的asyncio和aiohttp库提供了强大的异步爬虫支持,使得开发者能够轻松构建高效的异步爬虫。什么是异动爬虫?为
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(