在最近的“技术讨论”中,有人问我“你如何使用一个线程来实现多线程?”确认面试官不认为这是一个恶作剧后,我不得不承认我不知道如何在一个线程上实现多线程,并且进一步认为这个问题有些矛盾。面试官给出的答案是“通过使用多路广播委托”,让我想知道他是否真正理解了委托和底层线程。我很想知道这个问题是否有任何价值,更重要的是,相关答案是否有任何意义。谢谢。
协程是一种用于模拟协作式多线程的方法(.NET不支持,除非我们将async
/await
模式视为协程模式)。
异步编程模拟多线程(至少部分地...例如,可以同时执行多个读/写操作)...两者都是隐藏“线程”部分的可能解决方案。
为了详细说明异步编程...可以基于单个线程+异步处理构建一个完整的Web服务器,能够同时响应数百个请求。每次从磁盘读取都将以异步方式完成。每个连接客户端的响应都将以异步方式完成,等等。
就我所理解的而言,node.js是一个完全基于异步编程(技术上称为非阻塞I/O)的单线程Web服务器...请参见https://dev59.com/dGUq5IYBdhLWcg3wF8nw#14797359
关于我所写的内容,我要补充一点,有些编程语言实现了所谓的Green threads。Green threads是一种不使用操作系统调度程序的协作线程。它们的代码在单个线程中执行(至少从它们的角度来看是这样)。似乎Go、Haskell、旧版Ruby和各种版本的Smalltalk都使用/曾经使用过green threads。