Python中实现协程的三种方式

 更新时间:2026年07月14日 09:30:54   作者:爱写代码的倒霉蛋  
还在为Python中的IO等待浪费时间而烦恼吗,本文为你详细讲解协程的概念和意义,并对比yield、asyncio装饰器和async await三种实现方式,帮你轻松理解协程如何在一个线程中实现任务切换,提升程序效率,需要的朋友可以参考下

协程

协程,简而言之,就是通过一个线程实现代码块相互切换执行。

协程的意义:在一个线程中如果遇到IO等待时间,线程不会傻傻等,利用空闲时间再去干点其他事

实现协程的几种方法:

1.yield关键字

2.asyncio装饰器(3.4版本)

3.async,await关键字(3.5版本后,推荐使用)

1.yield关键字

def func1():
	yield 1;
	yield from func2() #跳到func2函数里面
	yield 2
def func2():
	yield 3
	yield 4
f1=func1()
for item in f1:#每次循环,执行里面的yield
	print(item)

如果一个函数里面有yield关键字,我们就认为是生成器函数,只要执行函数,返回的就是生成器

但是在真正实现协程,我们不会用这种方式,这里了解即可。

2.asyncio装饰器(3.4版本)

import asyncio
@asyncio.coroutine
def func1():
	print(1)
	yield from asyncio.sleep(2) #遇到IO耗时操作,自动化切换到tasks中的其他任务
	print(2)
@asyncio.coroutine
def func2():
	print(3)
	yield from asyncio.sleep(2) #遇到IO耗时操作,自动化切换到tasks中的其他任务
	print(4)
tasks=[asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())]
loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

asyncio模块的特别之处在于遇到了yield from后面的IO操作,它不会傻傻地等,它会切换任务

实际应用:比如我要下载很多图片,在发送下载一张图片的请求后等待响应的时候,线程可以继续发送其它下载图片的请求,这时就可以节省很多时间

3.async,await关键字(3.5版本后,推荐使用)

import asyncio

async def func1():
	print(1)
	await asyncio.sleep(2) #遇到IO耗时操作,自动化切换到tasks中的其他任务
	print(2)

async def func2():
	print(3)
	await asyncio.sleep(2) #遇到IO耗时操作,自动化切换到tasks中的其他任务
	print(4)
tasks=[asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())
]
loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

这个完成的功能和asyncio装饰器其实是一样的,本质上就是把装饰器和yield from换成async 和 await,更加方便使用而已

到此这篇关于Python中实现协程的三种方式的文章就介绍到这了,更多相关Python协程实现方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 儿童python练习实例

    儿童python练习实例

    小编在网上整理了关于儿童python相关编程的练习实例,如果有小朋友对此感兴趣可以学习下。
    2018-05-05
  • Python提取视频中图片的示例(按帧、按秒)

    Python提取视频中图片的示例(按帧、按秒)

    这篇文章主要介绍了Python提取视频中图片的示例,分别按帧和按秒提取,帮助大家利用python处理视频,获取素材,感兴趣的朋友可以了解下
    2020-10-10
  • PyCharm使用matplotlib报MatplotlibDeprecationWarning问题解决办法

    PyCharm使用matplotlib报MatplotlibDeprecationWarning问题解决办法

    这篇文章主要给大家介绍了关于PyCharm使用matplotlib报MatplotlibDeprecationWarning问题解决的相关资料,主要是 matplotlib版本过高导致的,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • PyQt6之QCalendar控件的实现

    PyQt6之QCalendar控件的实现

    QCalendar类提供基于月份的日期选择功能,支持鼠标和键盘操作,默认选中当前日期,适用于需要日期输入的场景,本文就来详细的介绍一下PyQt6之QCalendar控件的实现,感兴趣的可以了解一下
    2025-09-09
  • 利用PyTorch实现VGG16教程

    利用PyTorch实现VGG16教程

    这篇文章主要介绍了利用PyTorch实现VGG16教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 全面解析Python中的Scikit-learn强大工具

    全面解析Python中的Scikit-learn强大工具

    Scikit-learn是一个功能强大的Python机器学习库,提供了统一的接口实现各种机器学习算法,通过本文,你将了解如何安装和使用Scikit-learn,涵盖数据预处理、模型选择、训练和评估等步骤,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • Python利用Scrapy框架爬取豆瓣电影示例

    Python利用Scrapy框架爬取豆瓣电影示例

    这篇文章主要介绍了Python利用Scrapy框架爬取豆瓣电影,结合实例形式分析了Python使用Scrapy框架爬取豆瓣电影信息的具体操作步骤、实现技巧与相关注意事项,需要的朋友可以参考下
    2020-01-01
  • Python使用Pandas对比两列数据取最大值的五种方法

    Python使用Pandas对比两列数据取最大值的五种方法

    本文主要介绍使用 Pandas 对比两列数据取最大值的五种方法,包括使用 max 方法、apply 方法结合 lambda 函数、函数、clip 方法、where 方法结合条件赋值,并通过案例进行详细说明,需要的朋友可以参考下
    2025-02-02
  • Python定时爬取微博热搜示例介绍

    Python定时爬取微博热搜示例介绍

    大家好,本篇文章主要讲的是Python定时爬取微博热搜示例介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • python 实现 pymysql 数据库操作方法

    python 实现 pymysql 数据库操作方法

    这篇文章主要介绍了python实现pymysql数据库操作方法,文章基于python的相关内容展开对 pymysql 数据库操作方法的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04

最新评论