简单了解python协程的相关知识
作者:北京_星空 发布时间:2021-04-12 19:37:54
标签:python,协程
什么是协程
协程是python种一种实现多任务的方式,他是一种比线程更加小的单元,占用更小的执行单元(资源),为啥说他是一个执行单元,因为他自带CPU上下文,这样在合适gr的时机,可以把一个协程切换到另一个协程,只要在这个过程中保存和恢复cpu上下文那么程序还是可以运行的
通俗的理解: 一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量,然后切换到另一个函数中运行,并且切换的次数以及社么时候再切换回来是可控的
协程和线程的差异
在实现多任务时,线程会自己欢子一些数据,操作系统切换时需要恢复数据,所以线程恢复比较耗性能
协程底层原理(举例)
'''
1,协程的实现原理,底层通过 yield 实现
'''
def work1(): #工作任务
for i in range(10):
print('work1----{}'.format(i))
yield i
def work2():
for i in range(10):
print('work2----{}'.format(i))
yield i
def work3():
for i in range(10):
print('work3----{}'.format(i))
yield i
g1 = work1()
g2 = work2()
g3 = work3()
while True: #循环调用生成器实现任务切换
try:
print(next(g1))
print(next(g2))
print(next(g3))
except StopIteration :
pass
break
协程 greenlet
python -m pip install greenlet
示例
'''
1,展示greenelent ,不能自动切换需要手动切换
'''
import greenlet
def work1():
for i in range(10):
print('work1----{}'.format(i))
g2.switch() #切换到g2
def work2():
for i in range(10):
print('work2----{}'.format(i))
g1.switch() #切换到g1
g1 = greenlet.greenlet(work1) #返回协程对象
g2 = greenlet.greenlet(work2)
g1.switch() #启动开关
执行顺序
gevent
greenlet 已经实现了协程,但是还是人工切换,gevent 提供了自动切换功能,其原理是执行过程中遇到IO操作,自动切换
'''
协程gevent IO操作会切换
'''
import gevent
def work1(): # 工作任务
for i in range(10):
print('work1----{}'.format(i))
gevent.sleep(0.5)
def work2():
for i in range(10):
print('work2----{}'.format(i))
gevent.sleep(0.5)
g1 = gevent.spawn(work1) #指定工作函数
g2 = gevent.spawn(work2) #指定工作函数
g1.join() #等待协程执行完成再往下走
g2.join()
来源:https://www.jianshu.com/p/3454cc999e04


猜你喜欢
- jsp表达式方式: <center> <table border="1"> <% for
- 背景每次加载数据都要重新Load,想通过加入的注解方式开发缓存机制,每次缓存不用写代码了缺点:目前仅支持一个返回值,虽然能弄成字典,但是已经
- 下面就来介绍一下这些在后台辛勤工作的进程们。系统检测器(System Monitor,SMON)、进程监视器(Process Monitor
- 简述Motivationsometimes,换一种获取数据的方式,可以提高数据获取的速度。sometimes,由于预计爬取的数据长度不确定,
- 1. 得到安全字符串,在查询中使用,过滤单引号。Function Get_SafeStr(str) &nb
- 前言如果电脑是第一次安装MySQL,一般不会出现这样的报错。如下图所示。starting the server失败,通常是因为上次安装的该软
- webpack.config.js文件通常放在项目的根目录中,它本身也是一个标准的Commonjs规范的模块。var webpack = r
- <% dim result,result1 str="ad_asp之家_nzlkjlkfjoj
- 用python2的小伙伴肯定会遇到字符编码的问题。下面对编码问题做个简单的总结,希望对各位有些帮助。 故事零:编码的定义 我们从“SOS“(
- 方法一:需要在网络条件下安装win+R进入运行框输入命令cmd点击确定进入普通下载:pip install 模块名字例如:输入pi
- 本文实例讲述了python实现的汉诺塔算法。分享给大家供大家参考,具体如下:规则:圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定在
- 1.GridView无代码分页排序:效果图:1.AllowSorting设为True,aspx代码中是AllowSorting="
- 就我个人经验来讲:除了oracle,没有比HP 客户支持中心更糟糕的体验了。刚买不到一个月的HP MINI笔记本,莫名其妙键盘上的引号键松动
- 问题描述现有一个有向无权图。如下图所示: 问题:使用某个顶点s作为输入参数,找出从s到所有其他顶点的最短路径。 说明:因为是无权
- 本文为大家分享的Python工程师面试题主要与Python Web相关,供大家参考,具体内容如下1、解释一下 WSGI 和 FastCGI
- 一、python压缩模块简介python直接通过内置压缩模块可以直接进行压缩文件的创建;内置模块 zipfile/rarfile 完成压缩文
- 使用FFmpeg命令拼接多个mp3格式的音频文件时报错抛出异常,使用命令格式如下:ffmpeg -i 1.mp3 -i 2.mp3 -fil
- vue3无法使用jsx问题报错一:无法使用 JSX,除非提供了 "--jsx" 标志在Vite+Vue3.0中使用jsx
- 文件目录层级一、文件读取的绝对路径和相对路径用相对路径和绝对路径读取上一层目录的文件、下一层目录的文件及读取同层级的文件。# @File :
- 一、Base64编码原理步骤1:将所有字符转化为ASCII码;步骤2:将ASCII码转化为8位二进制;步骤3:将二进制3个归成一组(不足3个