月度归档:2021年05月

FastAPI 中的Async (并发和async/await)

引用文地址:https://fastapi.tiangolo.com/async/

前言:fastapi是一个广泛使用的高效的restful api框架,他的作者在这篇讲解框架中使用async的说明详细举例解释了异步编程、并发和并行的区别,堪称经典,于是手痒总结如下(不敢说翻译)

async使用指导:

  • 如果这个请求比较慢,比如连接数据库读取数据、文件IO、rpc调用等一般加上async,我想普通项目里大部分请求都会多多少少跟数据库打交道,所以加的往往比较多;
  • 比较快,稳定的使用def即可,也可以把没有上面情况调用的都按照这类处理;
  • 分不清加不加就不加,放心这不是什么大的问题,我在测试中发现不加效率高一丢丢,毕竟async是要开销的,特别适合首页这种重缓存的场景;

异步编程:

Asynchronous Code是给语言层面提供一种方式描述程序在某一点等待慢操作比如慢文件读写或者需要其它资源协作,从而让计算机可以在等待中去执行其它工作。文中作者详细列举了相对于cpu和内存操作来说慢的多的慢操作如:

  • 网络通信
  • 文件读写
  • 远程api调用如rpc调用
  • 数据库操作和查询

异步是相对同步编程来说的,在执行顺序上并没有改变。实际效果就是同一台机器如果有比较多的慢操作使用异步编程可以提高吞吐率。这里再吐槽一下,大部分语言比如python、csharp、go等的async都是协程实现的,只有java是线程实现的。代价:进程>线程>协程,java不是不能用协程来实现完全是因为历史包袱,线程相对也不会丢失太多的性能。

并发和汉堡的故事

异步的描述通常称之为并发,它跟并行不是一回事,虽然他们经常都是描述在同一时间内处理不同的事情。在细节上两者大不相同,可以下面就是用汉堡的故事来理解:
你带着心爱的小妹挤进忙碌的快餐店,排队等着付钱买汉堡。
轮到你的时候,你付钱买了两个很赞的大汉堡。
付钱
收银员告诉厨房新的订单,哪怕厨房还在准备前面的汉堡
收银员告诉你取餐号码
然后你和小妹找张桌子谈谈人生谈谈理想,因为汉堡太赞需要时间慢慢做
你趁这个时间对小妹一阵猛夸,如何如何的魅力,如何如何的动人
轮到你了后去柜台取走汉堡
然后就可以和小妹一起慢慢品尝

设想一下,如果是计算机中这个故事会怎么样
排队的时候你可能需要被迫傻等,而不是做点有意义的事比如调情,因为收银员得一个个收钱
当轮到你的时候你才会忙着看菜单,点单,付钱,确认找回来的钱,就算这样你还是没有拿到汉堡,只能去找张桌子等待
直到这个时候你才可以做些有意义的事
因为你有取餐号,所以直到显示屏上通知你可以取餐都不用担心你的汉堡被偷了
最后你去柜台取餐,道谢后算是完成任务并开始任务品尝美味的汉堡。

并行汉堡

现在设想下如果不是并发,而是并行,那么你跟你的小妹来到汉堡店就不是排一个队伍了,而是并行比如8个队伍,没有收银员只有厨师。
你前面每个人都在等他们的汉堡,拿到汉堡后才能离开柜台,厨师只有交出汉堡后才会收下一位的订单。
终于等到你了,付钱,然后等待厨师去厨房做汉堡
没有取餐号,因为没人在你前面,这时你和你的小妹只能干一件事就是确保自己在第一个不让别人抢走汉堡
等待很久以后才能拿走,这里几乎没有时间给你调情,真是个悲伤的故事。
在这个并行场景中你和你的小妹是两个处理器都等待了很久。
快餐店需要8个处理器,而并发下只需要2个。
当然,这个体验肯定不好。

汉堡总结

这个场景中有非常多的等待,所以它更适合并发系统。这也是web程序遇到的问题。太多太多的用户,但是你的服务器要等待不那么快的连接,然后还要等待回应。虽然这里的等待是以毫秒记,但是加起来就很恐怖了。所以这就是为什么Web APIs都用异步。
对于大多数现有的python框架都是在异步特性出现前设计的,所以他们大多以并行的方式实现异步,性能不强。

是不是并发比并行更好?

不,使用场景不同,并发适合web程序,但不是所有。比如科学计算,图形/音频处理,机器学习,深度学习等都适合并行计算。并行计算主要解决cpu瓶颈。

阿里云vs华为云 的容器镜像服务swr使用体验

容器镜像服务是CI构建中很重要的一换,毕竟dockerhub没有私有镜像服务,它除了给你的docker镜像加速外还可以存放你的构建,最最重要的都是免费的,目前阿里华为都有类似的服务。我一直以来使用的都是阿里云容器镜像服务,速度刚刚的,今天在整镜像的时候发现死活登录不上去,检查了一遍确认都没错,一脸懵逼,就阿里一直以来的niaoxing万一是他的问题呢于是想该用华为并对使用体验做个对比。下面是阿里登录容器镜像的截图:

这里是个人凭证页,可能企业版有所不同
  • 吐槽1:固定密码也就是我一直用的,很好很方便,虽然有点小担心,但是确实门槛低,我就不喷了。
  • 吐槽2:看到我红色涂的那个了么,没错我的账号,因为特殊原因第一个原生的账号被别人用了,经历了一顿复杂的操作后我才拿到的第二个账号,这里吐槽下阿里的账号流程乱的不行,肯定没有很好的产品梳理,最后只能人工介入,是不是很阿里的smell,有经验的在用阿里产品的多多少少应该有类似的情况喷到。
  • 吐槽3:2的问题就算了,新的账号居然给我弄一堆***,阿里的同学们请问这是什么逻辑,有重复的或者任何原因用任何字符都行,来一堆***,让人总是认为背后真实的数字是什么,结果它真实的id就是星星。。。。
  • 吐槽4:星星带来的结果就是命令行里头你会提示错误,机智如我,你可以用ID来代替,ID是一串数字,可以在右上角找到

果断开始注册华为,这里赞一下登录时候的提示,当输入手机号后它会提示你选择,如果你曾经在华为不同的业务上注册的账号里选一个。另外找回账号时它不要求你全答对,这就很严谨又很人性化,最后能把账号顺利注销开始新生活。废话不多说,进入华为swr后傻眼了

原文链接:https://support.huaweicloud.com/usermanual-swr/swr_01_1000.html

这里最重要的是第三步,得到第三步就可以拼凑出4中的登录命令。

  1. 图中3里头就是用你的ak+sk hash出了登录密码,这里要赞一下的是这种方式不会丢失你的私钥,安全比阿里好多了,个人设置的固定密钥一般都比较简单。实在偷懒把生成的后的密钥记录下来即可。
  2. 最后生成命令这里更取巧,直接用了ak,ak本身就是密钥id,也就是说只要你这个密钥还用就成立,同样的你的这个ak销毁了,登录也就失效了。
  3. 这里的区域项目名可以在华为提供的可用区域里选择。我挺好奇的是阿里只给了一个杭州节点,华为给了north和east两个,难道阿里不是份额最大的厂么。

最后吐槽一下,发现使用阿里的各种镜像服务越来越不稳定,应该不是马爸爸缺钱了,估计是被人玩坏了,比如容器镜像,最近有人利用它不限制容量的漏洞来做网盘。。。华为就不行,它有2g上限,谁的镜像能上2g啊。名族之光,技术中流不是吹的。。。