一、协程

1.历史进程:

(1)3.4引入协程,用yield来实现

(2)3.5引入协程语法

(3)实现协程比较好的包有asyncio,tornado,gevent

2.定义:协程是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序

3.从技术角度讲,协程就是一个可以暂停执行的函数,或者干脆把协程理解为一个生成器

4.协程对资源的消耗很小,要比多进程消耗的资源小多了,因此多并发下,协程更节省资源。

5.协程的实现

(1)yield返回;(2)send调用

(3)协程的三个状态:


inspect.geigeneratorstate(...)函数确定,该函数会返回下面的字符串中的一个:

GEN_CREATED:等待开始执行

GEN_RUNNING:解释器正在执行

GEN_SUSPENED:在yield表达式处暂停

GEN_CLOSED:执行结束

next预激(prime)

6.举例子(注意里面的注释)

def simple_coroutine():

    print("->start")

    x = yield#这个函数执行到这里停止了,等待着给它赋值,也就是后面的send语句

    print("->recived",x)

#主线程

sc = simple_coroutine()

print(1111)

#可以使用sc.send(None),效果一样

next(sc)#预激

print(2222)

sc.send("zhexiao")

执行顺序过程如下:

执行结果:

7,既返回值又用send语句的代码

注意:

可以看出这个yield相当于return
语句通过后面的send,之后等价于input语句

def simple_coroutine2(a):

    print("->start")

    b = yield a#可以看出这个yield相当于return 语句通过后面的send,之后等价于input语句

    print("->recived",a,b)

    c = yield a+b

    print("->recived",a,b,c)

​

sc2 = simple_coroutine2(5)

aa = next(sc2)

print(aa)

bb = sc2.send(6) #5,6

print(bb)

cc = sc2.send(7) #5,6,7

print(cc)

8.协程异常

协程中未处理的异常会向上冒泡,传给next函数或者send方法的调用方(即触发协程的对象)

停止协程的一种方法:发送某个哨符值,让协程退出,内置的None和Ellipsis等常量经常用作哨符值

二、源码

d27_3_usage_of_coroutine.py

https://github.com/ruigege66/Python_learning/blob/master/d27_3_usage_of_coroutine.py​

2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)

3.博客园:https://www.cnblogs.com/ruigege0000/

4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

Python连载40-协程定义及状态、send语句、yield用法的更多相关文章

  1. Python中Paramiko协程方式详解

    什么是协程 协程我们可以看做是一种用户空间的线程. 操作系统对齐存在一无所知,需要用户自己去调度. 比如说进程,线程操作系统都是知道它们存在的.协程的话是用户空间的线程,操作系统是不知道的. 为什么要 ...

  2. python中的协程及实现

    1.协程的概念: 协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回来的时候,恢复先前保存的寄存器上下文和栈. 因此,协程能保留 ...

  3. python线程、协程、I/O多路复用

    目录: 并发多线程 协程 I/O多路复用(未完成,待续) 一.并发多线程 1.线程简述: 一条流水线的执行过程是一个线程,一条流水线必须属于一个车间,一个车间的运行过程就是一个进程(一个进程内至少一个 ...

  4. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  5. Python与Golang协程异同

    背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...

  6. 第十一章:Python高级编程-协程和异步IO

    第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...

  7. Python中异步协程的使用方法介绍

    1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...

  8. [转载]Python 3.5 协程究竟是个啥

    http://blog.rainy.im/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/ [译] Python 3.5 协程究 ...

  9. [译] Python 3.5 协程究竟是个啥

    转自:http://blog.rainy.im/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/ [译] Python 3.5 ...

随机推荐

  1. 在Keras中使用VGG进行物体识别(直接使用)

    https://blog.csdn.net/baimafujinji/article/details/80700263

  2. gradle引jar包,引工程

    gradle引jar包有直接引mvn仓库的,也有引本地的,引本地jar包需要: compile files("xxxxxx.jar")

  3. Liunx学习总结(九)--防火墙

    防火墙的作用 防火墙作为一个边界防御工具,其监控流量要么允许它.要么屏蔽它. 多年来,防火墙的功能不断增强,现在大多数防火墙不仅可以阻止已知的一些威胁.执行高级访问控制列表策略,还可以深入检查流量中的 ...

  4. Java多线程之线程的生命周期

    Java多线程之线程的生命周期 一.前言 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(R ...

  5. springboot之additional-spring-configuration-metadata.json自定义提示

    springboot之additional-spring-configuration-metadata.json自定义提示 简介 additional-spring-configuration-met ...

  6. CSS文件引入link和@import 区别

    1.(本质区别)link 属于 HTML 标签,而 @import 完全是 css 提供的一种导入 css 文件的规则. 2.文件加载时机有差别: 当一个页面被加载的时候,link 引用的 css 会 ...

  7. k8s集群部分常见问题处理

    目录 部分常见问题处理 Coredns CrashLoopBackOff 导致无法成功添加工作节点的问题 添加工作节点时提示token过期 kubectl 执行命令报“The connection t ...

  8. 【linux】【qt5】【信号槽示例】

    什么叫信号槽: 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目的的, ...

  9. HDU 3062 Party 裸 2-sat

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; cons ...

  10. Pytorch读取,加载图像数据(一)

    在学习Pytorch的时候,先学会如何正确创建或者加载数据,至关重要. 有了数据,很多函数,操作的效果就变得很直观. 本文主要用其他库读取图像文件(学会这个,你就可以在之后的学习中,将一些效果直观化) ...