这两天把自己用的几个程序改成异步服务器端了,这方面我并不熟,只能简要介绍一下。
相信刚学编程的人,第一个代码都是:
print("hello ! 2b !");
不管编译与否,这都是个单进程的程序。
然后有了多线程。
多线程可以理解为一个老板带着几个小弟去街上发传单。多个人同时干活肯定比老板娘自己干要效率高
但是这发传单的小朋友可能会有一些拉肚子、逛街、接电话甚至直接玩起捉迷藏等等这样的事,导致工作时段并不能全程全速工作,导致了老板娘找的这些小朋友良莠不齐,有人一天下来忙的飞起,有人偷奸耍滑也能混一天。
在这个阶段,多线程自然会提升整体性能,但是无法避免的有些线程中途出毛病,所以老板还要一天几趟的到各个街口去监督小伙的工作,及时处置,其实这也是个很大的开销,搞不好这老板娘比小伙都累。而且要扩大业务的话,就需要批量新招小伙,这个成本太高。
于是人们开始捣鼓“事件驱动”这种方式。
其实事件驱动就是异步。
老板娘想了个招,每个小伙拿10个传单出去发,要求留下接收人的照片、联系方式,发完以后再回来找老板娘拿10个传单,于是整个小伙团队的效率就上来了,多劳多得么,谁干得多就拿钱多。小伙的工作效率提升了,老板娘的业务也大幅提升。所以网上那些人传的有人送外卖一个月上万,我是信的。
发传单就是工作负载,把意向客户的信息反馈给老板娘就是回调。当老板娘收到客户信息的时候,就知道某个小伙干完了,于是给他分配新的工作。
异步
老板娘让小伙a去交电费,让小伙b去放风筝,让c去车站接公子;b回来的时候再让他去买个肉夹馍,a回来的时候让他去打扫卫生。
这一系列就是异步的思路。简单的说就是提升计算效率,尽量把cpu的时间片用在工作负载上,而尽量不去做各种线程管理、上下文切换这种破事,毕竟分时系统么,计算效率是有上限的,杂事干多了,正事就干得少。
但异步也有自身的问题,因为异步是无法确保异步标记之前和之后的工作完成时间,也就是说无法确保顺序执行,那么在这种情况下就要妥善处理了,比如后面的代码需要前面的结果才能正确执行下去,那么这个代码段就不要中间再插一个异步了,不然就是没事找事。个人觉得把一部分需要绝对顺序执行的封装成一个函数或者过程,然后分发出去做异步,这是比较妥当的。
思路搞明白了,实际干起来就不难,各种语言的做法不会差距太大,我这两天分别用python和.net都试过,挺简单的。