python实现协程的具体示例

 更新时间:2024年03月21日 11:05:38   作者:liulanba  
协程是一种轻量级的并发编程技术,它允许程序在某个点上暂停执行,本文主要介绍了python实现协程的具体示例,具有一定的参考价值,感兴趣的可以了解一下

协程(Coroutine)是一种轻量级的并发编程技术,它允许程序在某个点上暂停执行,并在稍后恢复执行,而不是像线程那样在不同的执行上下文中切换。Python中的协程通常使用生成器函数或async/await关键字来定义。

生成器函数实现协程:

def simple_coroutine():
    print("协程开始")
    x = yield
    print("接收到的值:", x)

# 创建协程对象
coroutine = simple_coroutine()

# 启动协程
next(coroutine)

# 发送值给协程
coroutine.send(10)

async/await实现协程:

import asyncio

async def simple_coroutine():
    print("协程开始")
    await asyncio.sleep(1)
    print("协程结束")

# 创建事件循环
loop = asyncio.get_event_loop()

# 运行协程
loop.run_until_complete(simple_coroutine())

生成器函数实现:通过生成器函数定义的协程,可以在函数中使用yield关键字暂停执行,等待外部发送值给它。当调用生成器的send方法时,生成器会从yield语句处恢复执行,并接收发送的值。
async/await实现:使用async/await关键字定义的协程,可以在函数中使用await关键字暂停执行,等待某个异步操作的完成。当使用await关键字等待异步操作时,事件循环会继续执行其他任务,直到异步操作完成后,协程才会继续执行。
Python中的协程可以用于实现高效的异步编程,特别适用于I/O密集型的任务。通过协程,可以轻松地编写高效、简洁的异步代码,实现非阻塞的并发处理。

在使用协程时,可以利用 asyncio 模块来调度协程的执行。asyncio 提供了一个事件循环(event loop),用于管理协程的执行和调度。

import asyncio

# 定义一个异步函数
async def print_numbers():
    for i in range(1, 6):
        print(i)
        # 模拟一个异步操作,等待0.5秒
        await asyncio.sleep(0.5)

# 创建事件循环
loop = asyncio.get_event_loop()

# 运行协程
loop.run_until_complete(print_numbers())

在这个示例中,print_numbers 是一个异步函数,它使用 async def 定义,其中包含了一个异步操作 await asyncio.sleep(0.5),用于模拟异步任务。然后通过 run_until_complete 方法运行了这个协程,使得事件循环可以调度它的执行。

另外,也可以使用 asyncio.create_task 方法来在事件循环中并发运行多个协程:

import asyncio

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

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

async def main():
    # 并发运行 task1 和 task2
    await asyncio.gather(task1(), task2())

# 创建事件循环并运行主协程
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

在这个示例中,task1 和 task2 是两个独立的协程,它们被同时调度执行,而 main 协程则使用 asyncio.gather 方法并发地运行了这两个协程。

在Python中,进程(Process)、线程(Thread)和协程(Coroutine)都是用于实现并发编程的技术,它们之间有着区别和联系:

进程(Process):
进程是操作系统分配资源的基本单位,每个进程都有独立的内存空间和执行环境。
进程之间的通信相对独立,通常需要借助进程间通信(IPC)机制,如管道、消息队列、共享内存等。
在Python中,可以使用 multiprocessing 模块创建和管理进程,每个进程都有自己的全局解释器锁(GIL),因此可以充分利用多核CPU。

线程(Thread):
线程是操作系统调度的最小执行单位,同一个进程内的多个线程共享相同的内存空间和全局变量。
线程之间的通信相对容易,可以直接共享全局变量和资源。
在Python中,可以使用 threading 模块创建和管理线程,由于全局解释器锁(GIL)的存在,Python中的线程并不能充分利用多核CPU,适合用于IO密集型任务。

协程(Coroutine):
协程是一种轻量级的并发编程技术,它允许程序在某个点上暂停执行,并在稍后恢复执行,而不是像线程那样在不同的执行上下文中切换。
协程通常使用生成器函数或async/await关键字来定义,是在单线程内部实现的,因此不需要像线程那样涉及操作系统调度。
在Python中,可以使用 asyncio 模块来实现协程,它提供了事件循环(event loop)来调度协程的执行,适合用于IO密集型任务和高并发的网络应用。

区别:

  • 资源占用:进程是操作系统分配资源的基本单位,拥有独立的内存空间和执行环境,因此创建和销毁进程的开销较大。线程是进程内部的执行单元,共享相同的内存空间和全局变量,创建和销毁线程的开销较小。协程是在单个线程内部实现的,并不需要操作系统调度,因此占用的资源更少。
  • 通信方式:进程间通信需要借助操作系统提供的机制,如管道、消息队列等。线程间通信相对容易,可以直接共享全局变量和资源。协程间通信通常通过消息传递或共享内存等方式实现。
  • 并发模型:进程是重量级的并发模型,适用于CPU密集型任务。线程是轻量级的并发模型,适用于IO密集型任务。协程是更轻量级的并发模型,适用于大量的IO密集型任务和高并发的网络应用。
  • 调度方式:进程和线程的调度由操作系统负责,具有较高的可靠性和稳定性。协程的调度由应用程序自己控制,可以灵活地调整执行顺序和优先级。

联系:

  • 进程、线程和协程都是用于实现并发编程,可以在多个任务之间实现并行执行,提高系统的吞吐量和性能。
  • 进程和线程都是操作系统层面的概念,而协程是在应用程序层面实现的。
  • 协程可以在单个线程内部实现并发,而不需要操作系统进行线程切换,因此具有更高的效率和更少的资源消耗。
  • 它们都可以用于处理多任务、提高系统的响应速度和资源利用率。
  • 在实际应用中,通常会根据任务的特点和需求选择合适的并发模型,或者结合多种并发模型来实现更复杂的应用场景。

总的来说,进程、线程和协程是并发编程中常用的三种技术,它们各自有着不同的特点和适用场景,可以根据具体的需求选择合适的并发模型。

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

相关文章

  • Python实现粒子群算法的示例

    Python实现粒子群算法的示例

    这篇文章主要介绍了Python实现粒子群算法的示例,帮助大家更好的理解和使用Python,感兴趣的朋友可以了解下
    2021-02-02
  • pytest用例间参数传递的两种实现方式示例

    pytest用例间参数传递的两种实现方式示例

    pytest提供了许多运行命令以供定制化运行某一类测试用例或者某个测试用例等,下面这篇文章主要给大家介绍了关于pytest用例间参数传递的两种实现方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • Python3二分查找库函数bisect(),bisect_left()和bisect_right()的区别

    Python3二分查找库函数bisect(),bisect_left()和bisect_right()的区别

    这篇文章主要介绍了Python3二分查找库函数bisect(),bisect_left()和bisect_right()的区别,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Python根据输入参数计算结果的实例方法

    Python根据输入参数计算结果的实例方法

    在本篇文章里小编个大家整理了一篇关于Python根据输入参数计算结果的实例方法,有兴趣的朋友们可以跟着学习参考下。
    2021-08-08
  • python爬取网易云音乐热歌榜实例代码

    python爬取网易云音乐热歌榜实例代码

    在本篇文章里小编给大家整理的是关于python爬取网易云音乐热歌榜实例代码,需要的朋友们可以学习下。
    2020-08-08
  • 利用Numba与Cython结合提升python运行效率详解

    利用Numba与Cython结合提升python运行效率详解

    近些年来, Numba和Cython在数学科学界得到了广泛的关注。它们都提供了一种加速CPU密集型任务的方法,但以不同的方式。本文描述了它们之间体系结构的差异
    2021-09-09
  • 基于telepath库实现Python和JavaScript之间交换数据

    基于telepath库实现Python和JavaScript之间交换数据

    telepath是一个Django库,用于在Python和JavaScript之间交换数据,使您可以构建具有丰富客户端接口的应用程序,同时将业务逻辑保留在服务器端代码中。
    2021-05-05
  • 一小时学会TensorFlow2之全连接层

    一小时学会TensorFlow2之全连接层

    这篇文章主要介绍了TensorFlow2之全连接层,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • python opencv人脸识别考勤系统的完整源码

    python opencv人脸识别考勤系统的完整源码

    这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Pandas中的loc与iloc区别与用法小结

    Pandas中的loc与iloc区别与用法小结

    loc函数:通过行索引 “Index” 中的具体值来取行数据(如取"Index"为"A"的行)而iloc函数:通过行号来取行数据(如取第二行的数据),这篇文章介绍Pandas中的loc与iloc区别与用法,感兴趣的朋友一起看看吧
    2024-01-01

最新评论