python异步调用(Python协程 & 异步编程(asyncio)资料汇总)python初学 / python异步编程与协程...

wufei123 发布于 2024-05-15 阅读(33)

多一句没有,少一句不行,用最短的时间,教会你有用的技术「今天分享一点异步的资料」用到的时候再来深入学习,建议根据这里提供的资源,先捡能学的懂的部分看,看完之后建立一个大致的印象,以后遇到项目实践再回过头来翻看就行了。

学着学着,我发现好多东西太深了,容易迷失自己真正想要的现在就算搞明白了,过几天又不懂了,就太浪费时间了,因为真正想搞懂还是结合着实践才行参考资料-1学习的时候,跟着文章做了些笔记Python的Sync与Async执行速度的快慢。

https://juejin.cn/post/7026648216829427749线程的运行都是靠cpu来执行的, 而cpu是有限的, 同一时刻只能支持固定的几个worker运行, 其他线程则得等待被调度, 这样就意味着每个线程都只能工作一个时间分片, 之后就会被调度系统控制进入阻塞或者就绪阶段, 让位给其他线程, 直到下次获取时间分片时才可以继续运行。

为了能模拟出同一时刻内, 多个线程同时运行, 且防止其他线程饿死的情况, 线程每次获得的运行时间很短, 线程间的调度切换很频繁, 当启用更多的进程和更多的线程时, 调度就会更加的频繁不过调度线程的开销还不算大, 比较大的开销是调度线程而产生的下文切换和竞争条件(具体可以参考《计算机导论》中进程调度相关的资料, 我这里只是简单说明), cpu在执行代码时,它需要把数据加载到cpu的缓存中去的再运行, 当cpu运行的线程在这个时间分片内执行完成时, 该线程的最新运行数据就会保存起来, 然后cpu会去加载准备被调度的线程的数据, 并运行。

虽然这部分暂存数据是保存在比内存更快, 比内存更靠近cpu的寄存器上, 但是寄存器的访问速度也没有cpu缓存的访问速度快, 所以cpu在切换运行的线程时, 都会花上一部分时间用来装载数据上还有装载缓存时的竞争问题。

对比线程的调度产生的上下文切换与抢占式, async语法实现的协程是非抢占式的, 协程的调度是依赖于一个循环来控制, 这个循环是一个非常常高效的任务管理器和调度器, 由于调度的是一段代码的实现逻辑, 所以cpu的执行代码并不用切换, 也就没有上下文切换的开销, 同时, 也不用考虑装载缓存的竞争问题。

初识Python协程的实现本文作者还演示了如何使用生成器实现一个协程的代码,蛮难的,多看几遍,跟着多敲敲体会体会https://juejin.cn/post/7028534180023631908def demo():。

     a=1     b=2print("aaa",locals())     yield 1print("bbb",locals())     yield 2return"None"

这段代码首先通过函数调用生成一个demo_gen的生成器对象, 然后第一次send调用时返回值1, 第二次send调用时返回值2, 第三次send调用则抛出StopIteration异常, 异常提示为None

, 同时可以看到第一次打印aaa和第二次打印bbb时, 他们都能打印到当前的函数局部变量, 可以发现在即使在不同的栈帧中, 他们读取到当前的局部函数内的局部变量是一致的, 这意味着如果使用生成器来模拟协程时, 它还是会一直读取到当前上下文的.

Python的可等待对象在Asyncio的作用https://juejin.cn/post/7085256098885681159直接awaitCoroutine对象时,这段程序会一直等待,直到Coroutine对象执行完毕再继续往下走,而Task对象的不同之处就是在创建的那一刻,就已经把自己注册到事件循环之中等待被安排运行了,然后返回一个task对象供开发者等待,由于

asyncio.sleep是一个纯IO类型的调用,所以在这个程序中,两个asyncio.sleepCoroutine被转为Task从而实现了并发调用与Coroutine只有让步和接收结果不同的是Future除了让步和接收结果功能外,它还是一个只会被动进行事件调用且带有状态的容器,它在初始化时就是。

Pending状态,这时可以被取消,被设置结果和设置异常而在被设定对应的操作后,Future会被转化到一个不可逆的对应状态,并通过loop.call_sonn来调用所有注册到本身上的回调函数,同时它带有。

__iter__和__await__方法使其可以被await和yield from调用Task是Future的子类,除了继承了Future的所有方法,它还多了两个重要的方法__step和__wakeup。

,通过这两个方法赋予了Task调度能力,这是Coroutine和Future没有的「== 剩下的大部分是源码解读,太烧脑了,以后再来,能跟着敲的跟着敲一遍==」https://juejin.cn/column/7026646119589347336。

Python Asyncio调度原理,Python 3.11 Asyncio新增的两个高级类,Python Asyncio 库之常用函数详解参考资料-2不管三七二十一,看的脑壳疼,先记录于此吧序号文章链接。

备注1https://www.cnblogs.com/traditional/p/11828780.htmlasyncio:python3未来并发编程主流、充满野心的模块2https://www.jianshu.com/p/29ffdbd65679

Python黑魔法asyncio之----在多线程中启用多个事件循环3https://www.cnblogs.com/traditional/p/11828780.htmlasyncio:python3未来并发编程主流、充满野心的模块

4https://cloud.tencent.com/developer/article/1187407深入理解Python异步编程5https://zhuanlan.zhihu.com/p/59621713

Python中协程异步IO(asyncio)详解7https://www.bilibili.com/video/BV1Rq4y1s7Tg「视频教程,且看且珍惜」8https://www.cnblogs.com/crazymagic/articles/10066612.html

python 协程和异步io- 上面视频教程文字版9https://www.cnblogs.com/crazymagic/articles/10066619.htmlpython asyncio并发编程- 上面视频教程文字版

10https://www.bilibili.com/video/BV1Ke411W71L2小时学会python asyncio-老男孩的教学视频,讲的蛮细的,可以先看这个哦

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻9440