首页 > 异步函数的实现是不是一定要多线程支持?

异步函数的实现是不是一定要多线程支持?

(多核cpu的情况下) 比如我发起一个async_write函数, 这个函数调用后立马返回了, 继续向下执行, 不会造成阻塞,当这个写操作完成后, 操作系统来通知我, 写操作完成了. 然后执行回调函数. 那么, 是不是这个"写操作"的这个过程是由别的线程或者是什么东西来完成的? 单线程却异步的代码的背后是不是有一堆线程来辅助执行? 还有,我同是发起很多个异步函数后, 是不是一个异步函数对应一个线程? 还是这很多个异步函数只对应一定数目的线程(线程池?)? 如果是单核cpu 那又是怎么实现异步呢?


首先CPU核心数和线程数并不是对应的,并不是说你是单核CPU就只能执行一个线程。线程是操作系统模拟出来的概念,通过系统的调度算法实现“并行”运行(实际上在单核核心中还是串行的)。

至于异步操作,当然是扔到另外一个线程里去执行啦。当然,你也可以在单一线程里模拟出异步的效果,但是这实际上就是在干操作系统干的事情。


异步程序的关键是非阻塞io,具体就是select函数以及linux上的epoll和mac上的kqueue,自己建一个事件循环,一旦有io动作就切换到其他任务执行,并不断扫描各个io任务的执行情况。

典型的异步应用例子是nginx,lighttpd,python 3.4中的asyncio库,nodejs。这几个都不是通过线程实现的,试想,如果用线程来实现,nginx如何能做到10万并发连接。


  1. 异步的背后一定有多线程的支持。

  2. 异步程序背后可能有一到多个线程支持。

  3. 单核也支持多线程。一段程序并不会一直不停执行,操作系统会运行调度,让这个程序(线程)跑一会儿,再让那个程序(线程)跑一会儿。由此支持多线程。

【热门文章】
【热门文章】