Python3 async异步协程 - kernel panic

Python3 async异步协程

大概因为这域名集齐了几大诈骗网址的特征:在香港不用备案,域名里有gov,结尾org,来来回回封锁-手动解封几次了…所以完整版本如果要看的话去浏览器开吧。

想起刚入坑编程的时候,都是些if-else,即使是分支结构,也始终在一条线上运行。后来知道了线程(池),甚至在没学过死锁的情况下自己实现了线程安全的操作,虽然那时还不知道这些术语,现在才知这道操作叫做’互斥锁’。

学校教的Python

首先吐槽一下,学校教的Python感觉都停留在版本3.6以前,也有可能是书本没更新。
我觉得教Python的老师看下官方文档,讲点新特性也好啊。比如

  1. 3.8的‘f-字符串支持’
    https://docs.python.org/zh-cn/3.8/whatsnew/3.8.html#f-strings-support-for-self-documenting-expressions-and-debugging ,初学者基本上都是面对控制台的,整那些花里胡哨的控制台(比如输出左右对齐那种)我觉得没什么意义,以后做出来的程序不可能在控制台上交给用户吧,要是给用户一个黑框框那体验该多差啊,所以用这个调试上比字符串 format() 方法在字符串里插入变量方便得多。
  2. 3.10的结构化模式匹配match语句 https://docs.python.org/zh-cn/3/whatsnew/3.10.html#pep-634-structural-pattern-matching ,与C语言的switch类似,但结合进了Python的特性。

对并发的认识

通过《操作系统》的学习,知晓了每次线程切换都涉及系统调用,开销极大,既要保护现场又要切换上下文,直到某次在GitHub上看源码看到了异步I/O,整个并发在一个线程里进行。
Async算是Python中比较高级的知识了,主要是这些年Py的官方文档更新很快,用法和特性一直在变,网上找到的资料很多都是过时的,特花了几天时间读官方文档,大概清楚了运行流程,大概毕业设计能用上吧,简单记录一下。

线程、进程和协程

异步,意味着总是走走停停的,我感觉生产者消费者的例子更适合用协程而不是线程来解释。
假设线程是一个人,煮饭和炒菜是两件事,先煮饭后炒菜或者先炒菜后煮饭,是常见的顺序结构。如果雇一个人,你煮饭它炒菜,那么是多线程。而协程是煮饭过程中去炒菜,由一个人(单线程)完成。

大多数初学者的迷惑

不严谨的说,并发的极限就是并行了,比如时间片足够短,任务足够少。
在协程运行中,Python会维护一个事件循环,里面都是任务。
先看一个例子:
1.png
这样写为何是4s,a和b竟然没有并发执行,这里的await我觉得不要当成一个单词来看,看成async wait(异步等待)比较符合。这是因为await会先等a执行完才会去await b,和常规的串行没有太大的区别。
在await中,遇到IO操作,就会释放CPU給其它的协程,在这个例子中await a的时候,b还未进入事件循环,a结束后b才进入事件循环,所以是串行的。
那么如何同时添加多个事件进入事件循环呢?
先看官方文档怎么说,至少有中文文档,可惜官方文档接近机翻,读起来不是很好理解,我自己看都要看很久。
QQ截图20220221183929.png

暂时写到这里,去上课了

添加新评论

电子邮件地址不会被公开,评论内容可能需要管理员审核后显示。