惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Last Week in AI
Last Week in AI
H
Help Net Security
博客园 - 叶小钗
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 三生石上(FineUI控件)
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
G
Google Developers Blog
腾讯CDC
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
GbyAI
GbyAI
Microsoft Security Blog
Microsoft Security Blog
A
About on SuperTechFans
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
Martin Fowler
Martin Fowler
月光博客
月光博客
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
Vercel News
Vercel News

老董笔记

尚硅谷机构在哪?尚硅谷培训怎么样?靠谱吗-互联网IT百科 韩顺平介绍,传智讲师,开办泰牛,入尚硅谷等一系列-互联网IT百科 pandas多重索引标准样式(写入excel有空行)-互联网IT百科 cannot join with no overlapping index names-互联网IT百科 pandas多列变多行(即宽表变长表)melt和stack函数-互联网IT百科 pandas多行转多列(长表变宽表)pivot和unstack-互联网IT百科 Index contains duplicate entries, cannot reshape完美解决-互联网IT百科 single positional indexer is out-of-bounds-互联网IT百科 Can only compare identically-labeled Series objects-互联网IT百科 pandas transform用法详解(多个案例)-互联网IT百科 python四舍五入精确实现-互联网IT百科 pandas的groupby使用apply分组排序-互联网IT百科 index 0 is out of bounds for axis 0 with size 0-互联网IT百科 pandas分组过滤filter函数-互联网IT百科 联想Win10系统如何禁用触摸屏关闭触摸-互联网IT百科 groupby分组计算transform转换返回相同长度序列-互联网IT百科 brooks seo教程python教程,brooks seo教程网盘,布鲁seo资源-互联网IT百科 电脑右键文件夹一直转圈电卡死怎么回事-互联网IT百科 施琪嘉的心理成长课(荐)-互联网IT百科 百度SEO公司_SEO推广公司哪家好_SEO外包服务如何选-老董笔记 groupby后agg同1列用多个聚合函数、不同列用不同函数、自定义函数-互联网IT百科 pandas的groupby单列多列分组聚合运算-互联网IT百科 DataFrameGroupBy对象及分组个数、分组大小、组名索引、组数据详解-互联网IT百科 pandas中groupby之Grouper and axis must be same length-互联网IT百科 pandas中groupby的分组原理-互联网IT百科 pandas的groupby的使用详解大全-互联网IT百科 openpyxl单元格自动换行强制换行Alignment(wrapText=True)-互联网IT百科 python教程全套(可就业)-互联网IT百科 联想win10系统CPU显示100%,电脑呼呼响怎么回事-互联网IT百科 如何自制CPU,CPU原理是怎么样的?-互联网IT百科
yield是什么?为什么可以暂停程序,让出CPU-互联网IT百科
2021-11-19 · via 老董笔记

  学习python协程的时候可能遇见过一些古老的代码,利用生成器(yield)实现协程。通过yield可以让某个函数暂停,然后切换到当前线程内另1个函数去执行,从而实现单线程内的并发运行!这可能有点匪夷所思,在传统的认知里只有进程和线程才能实现切换,所以思想经历了三个阶段:

  1)不相信单线程内可以并发

  2)想知道yield为什么可以让出CPU

  3)进程和线程可以实现切换,为何还要多此一举设计yield

  通过向一些老师傅求教再加上个人理解,把上述三个疑问回答下

  关于第一点

  直接可以用一段代码证实,单线程可实现多个函数交替执行,打印出线程号来体现出是否在同1个线程。

start = time.time()

async def load_url(url, t):
    print(f"download {url}")
    print('----',threading.current_thread().name,threading.current_thread().ident)
    await asyncio.sleep(t)
    print(f"end...{url}")


t1 = load_url('url1', 2)
t2 = load_url('url2', 3)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(t1, t2))
loop.close()
end = time.time()
print("spent time:", end-start)
print('---',threading.current_thread().name,threading.current_thread().ident)
download url1
---- MainThread 7832
download url2
---- MainThread 7832
end...url1
end...url2
spent time: 2.988170862197876
--- MainThread 7832

  关于第二点

  yield是Python作者自己实现的一个协作和等待机制,一个线程内可能会有多个函数需要运行,可能有的函数需要等待,他们之间也可能需要互相协作,当一个函数要等待的时候,它就通过yield来告诉Python要进入等待状态。而Python维护了1个事件循环的列表,谁是什么状态都记录在案,通过不停的循环这个列表,一旦发现谁可以执行了就给它CPU用。至于怎么实现这种效果听说要研究如下源码:https://github.com/zpoint/CPython-Internals/blob/master/BasicObject/gen/gen_cn.md

  关于第三点

  进程和线程的切换是操作系统控制的,操作系统有自己一套调度算法,人是不能参与的。但是人类想对程序进行更加精细化的控制,想要最大限度的利用CPU,所以就研究出协程这个概念,操作系统是不知道有这个玩意的,这是人类在应用层投机取巧的一个设计思路。

很赞哦!

python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会