问题介绍
众所周知,python 的 aysnc/await 和 node.js 都是单线程实现的异步操作,很多人都告诉我“node.js”自带多线程功能,关于原理又一问三不知。
实际上两者实现异步的原理十分简单。
异步原理
事实上,所谓的“单线程实现异步操作”,本质上是一个线程在调度现在该执行的语句,而大家所说的多线程并发编程,指的是cpu调度多线程。
一个是主线程决定接下来该执行哪个语句,一个是cpu决定现在该运行哪个线程,区别就显而易见了吧。
既然知道了async/await只用了一个线程在实现异步操作,那为什么能变快呢?
事实上,异步功能是为了解决网络/进程通讯带来不必要等待的问题。
若不使用异步编程,你的网络请求发出后,主线程就会干等着另一方接受请求并作出回应,然而这个时间是可以被充分利用的,因此才有了异步操作。
由此看来,你等待的请求必须得是另外的机器或者进程在进行计算,这个计算不能占用你的主线程的资源,否则就和同步操作没有任何区别,这也是很多人产生误区的地方。
使用方法
Python
python 的使用方法是,在aysnc函数中,你先发出若干个请求,发出请求后可以做一些其他的事情,最后再await这些请求即可。
具体的实例网上有很多,就不过多介绍。
node.js
node.js的调度和python不太一样,node.js有一个回调函数,在请求得到回应后会通知主线程请求已经完成了,并执行回调函数,因此写出来的代码看起来就像“自带多线程”一样。