异步咖喱鸡(30分钟准时出锅)
计时开始-----------
- 起锅烧水
- 切土豆(150g-200g左右)胡萝卜(50g左右)
- 土豆胡萝卜下锅煮
- 切两块鸡腿肉(150g-200g左右)洗一下
- 加两勺生抽50g省份拧点黑胡椒料酒腌制
- 电饭锅煮饭
- 烧壶开水
- 切洋葱(半个)蒜4-5瓣转移到盘子里
- 洗刀和菜板,收拾一下
这时候差不多土豆已经煮了十分钟了
- 土豆胡萝卜出锅,水倒干净烧锅
- 倒油洋葱蒜爆香,加鸡肉加一点酱油炒到变色
- 土豆胡萝卜进锅炒一分钟
- 开水倒大概一升? (没量
- 加两个咖喱块(大约40g)开煮
- 洗碗收拾一下
米饭煮好了盛一碗出来晾着
煮到30分钟出锅开吃,如果还是嫌土豆硬可以多煮十分钟,需要多加点水
所谓异步任务,就是不占用cpu时间的任务,比如网络请求,磁盘读取等,利用某些机制等待这些任务完成从而增加cpu有效运行的时间,而占用cpu时间的任务只能同步运行,多线程/多进程只是把这些任务进行了调度使其并行运行或资源隔离,这一特点在单核处理器上表现的尤为明显,不论是被限制并发的js、python,还是其他常规语言,在单核处理器上使用多线程/多进程进行并发只会降低性能,其原因是用户(特指在用户空间)在使用不论哪种编程语言创建的线程,最终还是需要使用系统调用(clone系统调用)新建内核线程,交给内核进行调度,每次新建线程的系统调用会产生中断(典型的int80指令),和上下文切换(从用户空间切换到内核空间),而每次线程调度也会产生上下文切换(将运行线程的运行线程保存,切换到其他线程的现场),这些会对性能造成巨大损耗,而异步则不产生/少产生上下文切换和中断
总结下来异步就是等待外部运行时将程序挂起,执行其他的指令,而外部运行的程序通常被称作Task, 其返回的结果被称作Result, Future或promise, select系统调用就是典型的异步操作,内核在等待多个文件(一切皆文件)响应进行轮询,处理就绪的文件,而协程coroutine则是实现异步的一种方式,其特征有二,一是由用户进行调度,无需内核调度,二是普遍具有上下两部的特征,C++采用co_yield关键字, python采用yield关键字,而js采用回调函数,先执行上半部,将task转交给外部,接下来await调用yield进行等待,等到合适的时机()再返回到yield返回的地方继续执行,这里的关键就是yield之后怎么知道外部任务是否完成捏,js很简单因为js的异步实现是交给浏览器/node的线程池实现的,协程上半部执行完之后线程挂起,外部执行之后调用回调函数给出promise就好了,而python是把协程加入到event_loop中,再由select系统调用进行轮询查看是否满足yield之后应该获取的值,至于C++,还没整明白,目前来看应该是手动恢复协程下半部之后等待,C++真是越来越丑了。