简单了解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
0
投稿
猜你喜欢
- 在之前介绍PyQtGraph的文章中,我们都是一次性的获取数据并将其绘制为图形。然而在很多场景中,我们都需要对实时的数据进行图形化展示,比如
- 前言前几天逛github发现了一个有趣的并发库-conc,其目标是:更难出现goroutine泄漏处理panic更友好并发代码可读性高从简介
- 1、利用Python中的random模块中的choice方法random.choice()可以从任何序列,比如list列表中,选取一个随机的
- 确实,如果在原网站如果存在表单提交或cookies的验证,对于ASP来说,不使用基于SOCKET的组件就难以完成,其实,XMLHTTP的另外
- 关于怎么获得,我想其实网上有很多答案。list.index( )获得值的索引值,但是如果list中含有的值一样,例如含有两个11,22,这样
- 聚合函数 count,max,min,avg,sum... select count (*) from T_Employee select
- 'subject 信息标题 'company 发布信息的公司名称 'cont
- 如何显示数据库里的图片?asp调用数据库中的图片并显示。怎样把数据库里的图片显示出来?我们以gif格式的图片为例,代码如下:showimag
- 可能某次不小心改了配置文件,导致无法打开jupyter,找了很多方法,都没从根本上解决问题。倒是发现启动的默认目录被改了,怀疑是这个问题。然
- 最近在研究深度学习视觉相关的东西,经常需要写python代码搭建深度学习模型。比如写CNN模型相关代码时,我们需要借助python图像库来读
- 1,filesize()函数返回错误的值。 使用curl将某个页面下载到本地时,需要将下载到的临时文件tmpHtml.txt的内容读取到一个
- 上节我们了解了图形验证码的识别,简单的图形验证码我们可以直接利用 Tesserocr 来识别,但是近几年又出现了一些新型验证码,如滑动验证码
- 前言最近几天,研究了一下一直很好奇的爬虫算法。这里写一下最近几天的点点心得。下面进入正文:你可能需要的工作环境:Python 3.6官网下载
- 函数初解function,是一种语法结构,将实现某一个功能的代码块(多行代码)封装到一个结构中实现代码的重复利用函数定义语法:关键点:fun
- 当然这应该属于正常过滤手法,而还有一种过滤HTML标签的最终极手法,则是将一对尖括号及尖括号中的所有字符均替换不显示,该方法对于内容中必须描
- 作用:用ASP程序将页面中的电话号码生成图片格式。以下是引用片段:<% Call Com_CreatValidCode(Request
- 今天一同事需要整理http://ics.cnvd.org.cn/工控漏洞库里面的信息,一看960多个要整理到什么时候才结束。所以我决定写个爬
- 安装anaconda后查询CPU版本时打开Anaconda Prompt输入python然后输入import tensorflow as t
- SQL Server 2000使得以XML导出数据变得更加简单,但在SQL Server 2000中导入XML数据并对其进行处理则有些麻烦。
- 以下是通过Excel 的VBA连接Oracle并操作Oracle相关数据的示例Excel 通过VBA连接数据库需要安装相应的Oracle客户