Python中的并发编程asyncio库入门使用

作者:小小张说故事 时间:2021-02-13 05:03:52 

引言

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的并发编程能力,提高你的程序性能。

来源:https://segmentfault.com/a/1190000043800818

标签:Python,并发编程,asyncio,库
0
投稿

猜你喜欢

  • Python利用zhdate模块实现农历日期处理

    2023-03-07 22:10:20
  • 在Python中用keys()方法返回字典键的教程

    2023-08-20 17:45:39
  • PyCharm创建Django项目的简单步骤记录

    2023-08-28 11:03:37
  • 教你解决往mysql数据库中存入汉字报错的方法

    2024-01-15 02:32:06
  • Python利用matplotlib绘制约数个数统计图示例

    2023-11-12 16:00:43
  • 解析mysqldump的delay-insert选项

    2024-01-27 02:57:16
  • 使用Python的Bottle框架写一个简单的服务接口的示例

    2023-09-01 17:29:50
  • 纯JS实现AJAX局部刷新功能

    2024-05-02 17:04:38
  • Spring+Mybatis+Mysql搭建分布式数据库访问框架的方法

    2024-01-19 07:46:18
  • python enumerate内置函数用法总结

    2023-06-24 05:54:24
  • 使用Python实现控制摄像头的方法详解

    2023-01-15 14:38:12
  • 详解用Node.js实现Restful风格webservice

    2024-05-13 09:35:20
  • link 和 style 元素在 HTML 文档中的位置

    2008-06-02 13:56:00
  • Python正则简单实例分析

    2023-03-10 16:49:59
  • Go/C语言LeetCode题解997找到小镇法官

    2024-05-21 10:18:54
  • python Tkinter的图片刷新实例

    2023-10-31 04:32:24
  • python基于exchange函数发送邮件过程详解

    2021-03-23 02:12:22
  • Mysql 数据库常用备份方法和注意事项

    2024-01-17 15:43:25
  • 在CentOS系统上从零开始搭建WordPress博客的全流程记录

    2024-04-28 09:19:26
  • MySQL如何选择合适的索引

    2024-01-28 05:05:54
  • asp之家 网络编程 m.aspxhome.com