协程-单线程内的异步执行

2023-12-18

1、仿协程实例

不同事件依次顺序执行

# coding=utf-8
import time


def calculate_1(step, event_name):
    for index in range(step):
        print('This is 【%s】 event 【%s】 step' % (event_name, index))
        time.sleep(0.1)


if __name__ == "__main__":
    start_time = time.time()
    calculate_1(7, 'play')
    calculate_1(3, 'sleep')
    calculate_1(10, 'eat')
    calculate_1(5, 'run')
    calculate_1(4, 'drank')
    print('const time is: %s' % (time.time() - start_time))  # const time is: 3.214914560317993

执行结果:

This is 【play】 event 【0】 step
This is 【play】 event 【1】 step
This is 【play】 event 【2】 step
This is 【play】 event 【3】 step
This is 【play】 event 【4】 step
This is 【play】 event 【5】 step
This is 【play】 event 【6】 step
This is 【sleep】 event 【0】 step
This is 【sleep】 event 【1】 step
This is 【sleep】 event 【2】 step
This is 【eat】 event 【0】 step
This is 【eat】 event 【1】 step
This is 【eat】 event 【2】 step
This is 【eat】 event 【3】 step
This is 【eat】 event 【4】 step
This is 【eat】 event 【5】 step
This is 【eat】 event 【6】 step
This is 【eat】 event 【7】 step
This is 【eat】 event 【8】 step
This is 【eat】 event 【9】 step
This is 【run】 event 【0】 step
This is 【run】 event 【1】 step
This is 【run】 event 【2】 step
This is 【run】 event 【3】 step
This is 【run】 event 【4】 step
This is 【drank】 event 【0】 step
This is 【drank】 event 【1】 step
This is 【drank】 event 【2】 step
This is 【drank】 event 【3】 step
const time is: 3.2026631832122803

不同事件仿照协程的执行逻辑

# coding=utf-8
"""
    1、事件循环
    2、I/O操作时能够跳出
"""
import time
import queue


def calculate_1(step, event_name):
    for index in range(step):
        print('This is 【%s】 event 【%s】 step' % (event_name, index))
        yield
        time.sleep(0.1)


if __name__ == "__main__":
    cal_1 = calculate_1(7, 'play')
    cal_2 = calculate_1(3, 'sleep')
    cal_3 = calculate_1(10, 'eat')
    cal_4 = calculate_1(5, 'run')
    cal_5 = calculate_1(4, 'drank')

    event_loop = queue.Queue()
    event_loop.put(cal_1)
    event_loop.put(cal_2)
    event_loop.put(cal_3)
    event_loop.put(cal_4)
    event_loop.put(cal_5)

    has_event = event_loop.get()

    num_event, num_event_end = 5, 0
    flag_event_add = True
    start_time = time.time()
    try:
        while has_event:

            try:
                result = next(has_event)
                flag_event_add = True
            except StopIteration as e:
                print('事件结束')
                num_event_end += 1
                flag_event_add = False
                if num_event_end >= num_event:
                    break

            next_has_event = event_loop.get(block=False)
            if flag_event_add:
                event_loop.put(has_event)
            else:
                event_loop.put(next_has_event)
            has_event = next_has_event
    except queue.Empty as e:
        print("queue.Empty exception")
    print('const time is: %s' % (time.time() - start_time))  # const time is: 3.076279401779175

执行结果:

This is 【play】 event 【0】 step
This is 【sleep】 event 【0】 step
This is 【eat】 event 【0】 step
This is 【run】 event 【0】 step
This is 【drank】 event 【0】 step
This is 【play】 event 【1】 step
This is 【sleep】 event 【1】 step
This is 【eat】 event 【1】 step
This is 【run】 event 【1】 step
This is 【drank】 event 【1】 step
This is 【play】 event 【2】 step
This is 【sleep】 event 【2】 step
This is 【eat】 event 【2】 step
This is 【run】 event 【2】 step
This is 【drank】 event 【2】 step
This is 【play】 event 【3】 step
事件结束
This is 【eat】 event 【3】 step
This is 【run】 event 【3】 step
This is 【drank】 event 【3】 step
This is 【play】 event 【4】 step
This is 【eat】 event 【4】 step
This is 【eat】 event 【5】 step
This is 【run】 event 【4】 step
事件结束
This is 【play】 event 【5】 step
This is 【eat】 event 【6】 step
This is 【eat】 event 【7】 step
事件结束
This is 【play】 event 【6】 step
事件结束
This is 【eat】 event 【8】 step
This is 【eat】 event 【9】 step
事件结束
const time is: 3.0819501876831055

2、协程相关概念

asyncio:内置对异步IO的支持

event_loop事件循环:程序开启一个无限循环,通过将一些函数注册到事件循环上,当满足事件发生的时候,调用相应的协程函数

import asyncio


# python3.7以前的写法
loop = asyncio.get_event_loop()
print(loop)  # <ProactorEventLoop running=False closed=False debug=False>
loop.run_until_complete(asyncio.wait(task))

# python3.7之后的写法
asyncio.run(asyncio.wait(task))

coroutine协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是返回一个协程对象,协程对象需要注册到事件循环中,有事件循环调用

# 创建协程对象,并添加至列表
task = [coroutine_work_1(), coroutine_work_2()]

task任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步的封装,其中包含任务的各种状态

future:代表将来执行或者没有执行的任务的结果,和task没有本质上的区别

async关键字:async定义一个协程,

await关键字:await用于挂起阻塞的异步调用接口,await可以获取到可等待对象的返回值,当事件循环遇到await关键字后会调度其他任务

# 协程任务
async def coroutine_work_1():
    for i in range(5):
        print('do something %s' % i)
        await asyncio.sleep(1)

代码:

# coding=utf-8
import asyncio


# 协程任务
async def coroutine_work_1():
    for i in range(5):
        print('do something %s' % i)
        await asyncio.sleep(1)


# 协程任务
async def coroutine_work_2():
    for i in range(3):
        print('do other thing %s' % i)
        await asyncio.sleep(1)


# 创建协程对象,并添加至列表
task = [coroutine_work_1(), coroutine_work_2()]

loop = asyncio.get_event_loop()
print(loop)  # <ProactorEventLoop running=False closed=False debug=False>
loop.run_until_complete(asyncio.wait(task))

执行结果:

<ProactorEventLoop running=False closed=False debug=False>
do other thing 0
do something 0
do other thing 1
do something 1
do other thing 2
do something 2
do something 3
do something 4

3、python3.7及以上的另一种协程写法

# coding=utf-8
import asyncio


async def coroutine_func():
    print('do coroutine task ...')


# python3.6版本
loop = asyncio.get_event_loop()
loop.run_until_complete(coroutine_func())  # coroutine_func()是一个协程对象


# python3.7以上版本
async def main():
    task = [
        asyncio.create_task(coroutine_func())
    ]
    await asyncio.wait(task)

asyncio.run(main())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

协程-单线程内的异步执行 的相关文章

随机推荐

  • DAP如何对外提供数据服务

    在当今这个数据驱动的时代 数据的价值得到了前所未有的重视 随着企业信息化建设的不断推进和完善 数据已经成为企业决策 优化运营和提升竞争力的核心要素 企业通过数据分析 能够揭示隐藏在大量信息背后的规律 从而指导决策 优化流程 改善产品 并最终
  • 计算机毕设项目 - 公寓宿舍后勤管理系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 系统流程 3 2 1 系统开发流程
  • ASSY 11994R13 网通信模块

    ASSY 11994R13 网通信模块 ASSY 11994R13 网通信模块 产品详情 ASSY 11994R13 网络通信模块可能包含一些常见的特点 以下是可能的一些特征 但这只是一般性的 具体取决于该模块的设计和用途 通信接口 提供特
  • (附源码)SSM影院订票系统 毕业设计35370

    ssm影院订票系统 摘 要 随着互联网时代的到来 同时计算机网络技术高速发展 网络管理运用也变得越来越广泛 因此 建立一个 SSM 影院订票系统 订票系统 的管理工作系统化 规范化 也会提高平台形象 提高管理效率 本 影院订票系统 是针对目
  • 配音工具有什么软件?让有声小说之旅更加丰富多彩

    很多人都有看小说的爱好 但长时间看文字小说 眼睛不免会有些疲惫 令大家不得不暂时放弃观看文字小说 而有声小说则因为其生动的语音和更便捷的阅读体验 逐渐成为各位小说爱好者的心头好 与传统的文字小说相比 有声小说生动自然的配音反而为小说人物赋予
  • SSM计算机组成原理课程平台 毕业设计-附源码50168

    摘 要 21世纪的今天 随着社会的不断发展与进步 人们对于信息科学化的认识 已由低层次向高层次发展 由原来的感性认识向理性认识提高 管理工作的重要性已逐渐被人们所认识 科学化的管理 使信息存储达到准确 快速 完善 并能提高工作管理效率 促进
  • 2023年终盘点系列丨YonGPT正式发布,中国软件服务创新进入人工智能新阶段!

    人工智能是这个时代最前沿和普适的科学技术之一 如今 人工智能越来越多地走入各种业务与管理场景 在数字化的基础上 智能化成为企业与公共组织新的创新焦点 用友BIP从研发伊始就坚持把数字化和智能化作为两个最核心和最基本的特性 在数字化基础上 结
  • GE WES5302-150 数字量输入模块

    GE WES5302 150 数字量输入模块 GE WES5302 150 数字量输入模块产品详情 通道数量 这指的是模块上可用的数字输入通道的数量 通道通常对应于模块能够同时监测的数字输入信号数量 输入类型 确定模块支持的数字输入类型 例
  • ASSY 11993R2 电源模块

    ASSY 11993R2 电源模块 ASSY 11993R2 电源模块产品详情 ASSY 11993R2 电源模块是用于为设备或系统提供电源的组件 其产品特点可能因制造商和具体型号而异 以下是一般电源模块的一些可能的产品特点 电源输出 提供
  • PROSOFT RLX2-IHNF-A 无线通讯模块

    PROSOFT RLX2 IHNF A 无线通讯模块 PROSOFT RLX2 IHNF A 无线通讯模块 产品详情 PROSOFT的RLX2 IHNF A无线通讯模块可能用于各种工业自动化和远程通信应用 以下是可能涵盖的一些产品运营领域
  • AI分布式训练:DDP (数据并行)技术详解与实战

    编者按 如今传统的单机单卡模式已经无法满足超大模型进行训练的要求 如何更好地 更轻松地利用多个 GPU 资源进行模型训练成为了人工智能领域的热门话题 我们今天为大家带来的这篇文章详细介绍了一种名为 DDP Distributed Data
  • 零基础自学网络安全必备知识(详细版),啃完这些足够你学习了

    怎么入门 这个Web安全学习路线 整体大概半年左右 具体视每个人的情况而定 上传一直很模糊 所以就没有展开了 需要高清版的可以在下面领取 一学习路线高清版一 如果你把每周要学的内容精细化到这种程度 你还会担心学不会 入不了门吗 其实说到底就
  • Windows7系统PresentationHost.exe文件丢失问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个Present
  • 机器学习笔记 - 时间序列分析基础概念解释

    一 简述 时间序列分析是一种统计方法 可检查定期收集的数据点以揭示潜在的模式 该技术与各个行业高度相关 因为它可以根据历史数据做出决策和预测 通过了解过去并预测未来 时间序列分析在金融 医疗保健 能源 供应链管理 天气预报 营销等领域发挥着
  • Windows7系统psr.exe文件丢失问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个psr exe
  • 【华为OD机考 统一考试机试C卷】高效货运(C++ Java JavaScript Python)

    华为OD机考 统一考试 C卷 D卷 B卷 A卷 2023年11月份 华为官方已经将 华为OD机考 OD统一考试 A卷 B卷 切换到 OD统一考试 C卷 和 OD统一考试 D卷 根据考友反馈 目前抽到的试卷为B卷或C卷 D卷 其中C卷居多 按
  • Windows7系统rasautou.exe文件丢失问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个rasauto
  • Windows7系统rasphone.exe文件丢失问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个rasphon
  • Windows7系统proquota.exe文件丢失问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个proquot
  • 协程-单线程内的异步执行

    1 仿协程实例 不同事件依次顺序执行 coding utf 8 import time def calculate 1 step event name for index in range step print This is s even