程序员经常嘲笑自己,学习一门语言就是一个入坑和出坑的过程。
每门语言都有自己的特点和优点也有自身的缺点和短板,python同样不例外,当然做大的坑还是那个全局锁GIL那个东西了,刚开始接触python的时候,GIL是啥其实还真不关心,后来发现这个坑还真是一个不好爬的坑。
尤其是对线程、进程、协程、异歩这些东西的理解实在是被坑了着。下面记录一下被坑的过程和结论,有想避免这个坑的朋友参考一下。
在使用python过程中确实因为这个一个脚本语言,使用的是逐行解释的,对速度确实不是很满意。打算看什么方法来加快速度,所以原装的多线程和多进程入选。在用的过程中哦个发现多进程的难度的确很大,尤其是参数共享问题,所以首选是多线程。
直到有一天看到python的一个创始人建议用多进程而不建议多线程!因为GIL和…的原因。尼玛!进程太难用了好不好!
直到一天发现这个协程这个东西很好啊,不就是为了解决多进程的缺点吗?把参数的输入很输出弄成了各种方法来使用。
用起来好像并不复杂啊,先建一个loop(循环),把协程仍到这个loop里面运行,这个loop当作容器或者pool来看就可以了,当然一堆的方法是针对loop的,另外一堆的方法是针对处理协程本身的。
愉快的使用协程不错直到有一天我碰到了异歩这个东西,尼玛!协程不就是异歩工作吗?干嘛还来一个专门的异歩功能啊。直接就是一个风中凌乱了!协程还用不用?协程还是不是异歩?这个async和await是不是才是异歩啊?这个问题不亚于哈姆雷特的生与死的问题。没办法只有发扬工科男的执着的优势,弄清楚!查找了大量的资料和代码,好像终于弄懂了。
原来async和await是为了协程的异歩工作而进行的同步工作!
看到这句话的时候千万别起要打我的冲动!这句话才是全偏至关重要的重点!请自行重复三遍:
async和await是为了协程的异歩工作而进行的同步工作!
async和await是为了协程的异歩工作而进行的同步工作!
解释如下:
协程实际上是真正的异歩工作的,就是你把协程同时扔到一个loop里面去工作的时候,cup只会根据工作量的大小分时分片的工作,出来的时间点肯定是无法预测的!这就和逐行解释又成了一个矛盾!矛盾的东西好像真多!你真不希望应该到那个地方的时候,你还没获得协程给你的结果吧?
这就是async、await出现的价值了,就是给协程出现的结果再次排队进行一下同步!即异歩后进行同步排队,那就是一个wait的作用了。
async是告诉你这是一个协程的异歩的程序,await是告诉你在这里出现我要的结果。
协程是异歩工作模式的,async和await是为了协程的异歩工作而进行的同步工作。这就是这个完整的一句话。
总结:在单机使用python中,为了最大化使用cpu,推荐使用协程来进行编程,在需要同步(排队)下使用数据时,用async和await来还行异歩的同步。
全篇文字比较绕口,对初学者尤其是针对改善单机速度的同学有帮助,多读几遍想想。不建议再去研究多协程和多进程的内容了。拿起即用才是好东西。