在最近的“技术讨论”中,我被问到“你如何使用一个线程完成多线程?”在确认面试官不认为这是一个棘手的问题后,我不得不承认我没有好主意如何在单个线程上实现多线程,而且,我认为这个问题有点矛盾。面试官提供的答案“通过使用多播代表”,让我想知道他是否真的不了解代表和潜在的线程。我很想知道这个问题是否有任何优点,更重要的是,如果相关的答案有任何意义。谢谢。
答案 0 :(得分:4)
协同程序是为模拟协作式多线程而做的事情(.NET不支持,除非我们将async
/ await
模式视为协程模式)。
异步编程模拟多线程(至少部分...例如,同时执行多个读/写)...两者都是隐藏“线程”部分的可能解决方案。
详细说明异步编程......可以构建一个完整的Web服务器,能够同时响应数百个请求,基于单个线程+异步精化。磁盘上的每次读取都是异步完成的。对连接客户端的每个响应都将异步完成,等等。
根据我的理解,提供一个名称,node.js是完全基于异步编程的单线程Web服务器(技术上称为非阻塞I / O)...参见例如https://stackoverflow.com/a/14797359/613130
对于我所写的内容,我将补充说,有些语言可以实现所谓的Green threads。绿色线程是不使用OS调度程序的协作线程。他们的代码在一个线程中执行(至少从他们的角度来看)。似乎Go,haskell,旧Ruby,各种版本的Smalltalk都使用/使用绿色线程。)