返回顶部
首页 > 资讯 > 后端开发 > Python >Python协程一点理解
  • 478
分享到

Python协程一点理解

Python 2023-01-31 00:01:33 478人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

def test(): for i in 'abc': yield i for i in [1, 2, 3]: yield i if __name__ == '__main__':

def test():
    for i in 'abc':
        yield i
    for i in [1, 2, 3]:
        yield i


if __name__ == '__main__':
    gen = test()
    print(gen.send(None))
    print(gen.send(None))
    print(gen.send(None))
    print(gen.send(None))
    print(gen.send(None))
    print(gen.send(None))
    print(gen.send(None))
def test():
    for i in 'abc':
        yield i
    for i in [1, 2, 3]:
        yield i


if __name__ == '__main__':
    gen = test()
    for i in gen:
        print(i)

使用for循环生成器,因为for循环可以捕捉StopIteration异常。

上面的代码也可以用yield from实现

def test():
    yield from 'abc'
    yield from [1, 2, 3]


if __name__ == '__main__':
    gen = test()
    for i in test():
        print(i)

yield from 后面需要加的是可迭代对象,它可以是普通的可迭代对象,也可以是迭代器,甚至是生成器。

使用yield from实现实时计算器

def average_gen():
    """
    子生成器
    """
    average = 0
    total = 0
    count = 0
    while True:
        num = yield average
        if num is None:
            break
        count += 1
        total += num
        average = total / count
    return average, count, total


def proxy_gen():
    """
    委派生成器
    """
    while True:
        average, count, total = yield from average_gen()
        print(f'平均值{average}, 计算{count}次, 总和{total}')


def client():
    """
    调用端
    """
    calc_average = proxy_gen()
    calc_average.send(None)
    # next(calc_average)
    # 预激活协程
    print(calc_average.send(10))
    print(calc_average.send(20))
    print(calc_average.send(30))
    calc_average.send(None)
    # 关闭协程


if __name__ == '__main__':
    client()

在委派生成器中的while True可以替换成for循环,循环的大小决定调用端可以calc_average.send(None)的次数(第一次预激活也计入)。

while Truefor循环用来捕捉StopIteration异常,可以查看第一段代码。

示例

def average_gen():
    """
    子生成器
    """
    average = 0
    total = 0
    count = 0
    while True:
        num = yield average
        if num is None:
            break
        count += 1
        total += num
        average = total / count
    return average, count, total


def proxy_gen():
    """
    委派生成器
    """
    for i in range(2):
        average, count, total = yield from average_gen()
        print(f'平均值{average}, 计算{count}次, 总和{total}')


def client():
    """
    调用端
    """
    calc_average = proxy_gen()
    calc_average.send(None)
    # next(calc_average)
    # 预激活协程
    print(calc_average.send(10))
    print(calc_average.send(20))
    print(calc_average.send(30))
    calc_average.send(None)
    # 关闭协程
    print(calc_average.send(10))
    print(calc_average.send(20))
    print(calc_average.send(30))
    calc_average.send(None)


if __name__ == '__main__':
    client()

示例最后会抛出StopIteration异常。

因为在第二次calc_average.send(None)时,for循环捕捉了一次异常,进入了最后一次循环,在calc_average.send(None)时,for不能再次循环,不能处理StopIteration异常,故抛出。

--结束END--

本文标题: Python协程一点理解

本文链接: https://lsjlt.com/news/181698.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python协程一点理解
    def test(): for i in 'abc': yield i for i in [1, 2, 3]: yield i if __name__ == '__main__': ...
    99+
    2023-01-31
    Python
  • 深入理解python协程
    目录一、什么是协程二、了解协程的过程2.1、yield工作原理2.2、预激协程的装饰器2.3、终止协程和异常处理2.4、让协程返回值2.5、yield from的使用2.6、yield from的意义三、greenl...
    99+
    2022-06-02
    python 协程
  • 如何理解Python进程、线程、协程
    本篇内容介绍了“如何理解Python进程、线程、协程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是进...
    99+
    2024-04-02
  • 如何理解Python中的协程
    这篇文章主要介绍“如何理解Python中的协程”,在日常操作中,相信很多人在如何理解Python中的协程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Python中的协程”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-16
  • python爬虫入门教程--快速理解HTTP协议(一)
    前言 爬虫的基本原理是模拟浏览器进行 HTTP 请求,理解 HTTP 协议是写爬虫的必备基础,招聘网站的爬虫岗位也赫然写着熟练掌握HTTP协议规范,写爬虫还不得不先从HTTP协议开始讲起 HTTP协议是什...
    99+
    2022-06-04
    爬虫 入门教程 协议
  • python中Task封装协程的知识点梳理
    本篇内容主要讲解“python中Task封装协程的知识点梳理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python中Task封装协程的知识点梳理”吧!说明Task是Future的子类,Tas...
    99+
    2023-06-20
  • 怎么理解Kotlin协程
    这篇文章主要讲解了“怎么理解Kotlin协程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Kotlin协程”吧!协程的出现咱们先来说说协程的历史,以及它是怎么混的这么惨的,毕竟悲催的...
    99+
    2023-06-16
  • 一篇文章带你了解Python的进程,线程和协程
    目录线程线程锁threading.RLock和threading.Lock 的区别threading.Eventthreading.Conditionqueue 队列生产者消费者模型...
    99+
    2024-04-02
  • Python使用协程的缺点是什么
    这篇文章给大家分享的是有关Python使用协程的缺点是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。多核资源不能使用:协程的本质是单线程,它不能同时使用单个CPU的多核、协程。在多CPU上运行程需要与过程配合...
    99+
    2023-06-25
  • python协程
    目录 python协程入门 函数的执行顺序 协程概念 总结 python协程入门 函...
    99+
    2023-01-30
    python 协程
  • python 协程
    进程和线程都会的切换都要消耗时间,保存线程进程当前状态以便下次继续执行。在不怎么需要cpu的程序中,即相对于IO密集型的程序,协程相对于线程进程资源消耗更小,切换更快,更适用于IO密集型。协程也是单线程的,没法利用cpu的多核,想利用cp...
    99+
    2023-01-30
    python 协程
  • 一文理解Goland协程调度器scheduler的实现
    目录1. 调度器scheduler的作用2. GMP模型3. 调度机制1. 调度器scheduler的作用 我们都知道,在Go语言中,程序运行的最小单元是gorouines。 然而程...
    99+
    2024-04-02
  • Python中TCP协议的理解
    Test01–>TCP客户端案例 #! /usr/bin/env python3 # -*- coding:utf-8 -*- from socket import * def main(): # 1.创...
    99+
    2023-01-31
    协议 Python TCP
  • python线程、进程和协程详解
    引言 解释器环境:python3.5.1 我们都知道python网络编程的两大必学模块socket和socketserver,其中的socketserver是一个支持IO多路复用和多线程、多进程的模块。...
    99+
    2022-06-04
    线程 详解 进程
  • 怎么理解进程,线程,协程
    本篇内容介绍了“怎么理解进程,线程,协程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!进程进程是操作系统分...
    99+
    2024-04-02
  • Python全栈之协程详解
    目录1.线程队列2.进程池_线程池3.回调函数4.协程总结:1. 线程队列 # ### 线程队列 from queue import Queue """ put 存放 超出队列长...
    99+
    2024-04-02
  • Python进阶之协程详解
    目录协程协程的应用场景抢占式调度的缺点用户态协同调度的优势协程的运行原理Python 中的协程总结协程 协程(co-routine,又称微线程)是一种多方协同的工作方式。当前执行者在...
    99+
    2024-04-02
  • python协程与golang协程的区
    进程、线程和协程 进程的定义: 进程,是计算机中已运行程序的实体。程序本身只是指令、数据及其组织形式的描述,进程才是程序的真正运行实例。 线程的定义: 操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 进程...
    99+
    2023-01-31
    python golang
  • Python协程原理全面分析
    目录序章生成器如何进化为协程用作协程的生成器的基本行为协程的四个状态示例-使用协程计算平均值预激协程的装饰器终止协程和异常处理获取协程返回值使用yield fromyield fro...
    99+
    2023-02-08
    Python协程 Python协程原理
  • Kotlin协程launch原理详解
    目录正文launch使用launch原理CoroutineStart中找invoke方法startCoroutineCancellable逻辑小结正文 launch我们经常用,今天来...
    99+
    2022-11-13
    Kotlin协程launch Kotlin launch
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作