asynchronous编程如何在单线程编程模型中工作?
我正在浏览node.js
的细节,并且知道它支持asynchronous编程,尽pipe本质上它提供了一个单线程模型。
在这种情况下如何处理asynchronous编程? 是否像运行时本身创build和pipe理线程,但程序员不能明确地创build线程? 如果有人能指点我一些资源来了解这一点,那将是非常好的。
现在跟我说: asynchronous编程并不一定意味着multithreading。
Javascript是一个单线程运行时 – 你只是不能在JS中创build新的线程,因为语言/运行时不支持它。
弗兰克说得对(虽然呆呆地)英语:当事情进入你的应用程序时,有一个主事件循环。 所以,“处理这个HTTP请求”将被添加到事件队列中,然后在适当的时候由事件循环处理。
当你调用一个asynchronous操作(例如一个mysql数据库查询)时,node.js发送“嘿,执行这个查询”到mysql。 由于这个查询需要一些时间(毫秒),node.js使用MySQLasynchronous库执行查询 – 返回到事件循环并在等待mysql返回给我们时做其他事情 。 就像处理那个HTTP请求一样。
编辑 :相比之下,node.js 可以简单地等待(无所事事),让mysql回到它。 这被称为同步呼叫。 想象一下,一个餐厅,你的服务员把你的订单提交给厨师,然后坐下来,在厨师做饭的时候扭动他/她的拇指。 在一家餐馆,就像在一个node.js程序中,这样的行为是愚蠢的 – 你有其他客户饿了,需要服务。 因此,您希望尽可能asynchronous,以确保一个服务员(或node.js进程)尽可能多地服务于其他人。
编辑完成
Node.js使用C库与mysql进行通信,所以从技术上来说,这些C库可能会产生线程,但是在JavaScript内部,你不能对线程做任何事情。
瑞安最好说:同步/asynchronous是正交的单/multithreading。 对于单线程和multithreading的情况,有一个主事件循环使用Reactor Pattern来调用已注册的callback函数。 对于单线程的情况,在主线程上依次调用callback。 对于multithreading的情况下,它们在不同的线程上调用(通常使用线程池)。 这实际上是一个多less争用的问题:如果所有的请求都需要同步访问单个数据结构(比如说一个订阅者列表),那么multithreading的好处可能会减less。 这是问题依赖。
就实现而言,如果一个框架是单线程的,那么它很可能使用poll / select系统调用,即操作系统正在触发asynchronous事件。