2014-02-27 76 views

回答

4

我发现Express网站很好地解释了一些事情,并且Express对于新用户来说相当平易近人。

多线程系统(例如Java和底层JVM)包含许多执行线程,每个执行线程可以同时执行自己的代码指令(在多核硬件CPU上)或在两者之间切换,其中每个线程运行一段预定的时间,然后操作系统安排下一个线程执行。

节点程序在Node环境中执行,它是单线程的,所以整个程序只有一个代码执行线程,并且没有多个线程同时执行。

一个简单的比喻就是将事件循环与标准编程结构(while循环)进行比较,这正是它的原型。

while(1){ 
    // Node sets this up. Do stuff.. Runs until our program terminates. 
} 

启动一个节点程序会启动这个循环。你可以想象你的程序被插入到这个循环中。

如果程序中的第一条指令是从磁盘读取文件。该请求将被分派到底层的OS系统调用中以读取文件。

节点为读取文件等事物提供异步和同步功能,但通常首选异步功能,因为在同步调用中,单个线程系统中读取文件会导致整个程序停止运行。

while(1){ 
    require('fs').readFileSync('file.txt'); 
    // stop everything until the OS reports the file has been read 
} 

在(首选)异步版本中,读取文件的请求发送到操作系统,并且指定了回调函数,循环继续。该程序实质上等待操作系统响应,在下一个循环(aka)中,系统会调用您提供的回调函数(本质上只是内存中的一个位置)并返回结果。

while(1){ 
    // 1st loop does this 
    require('fs').readFile('file.txt', callback); 

    // 2nd loop does this, system calls our callback function with the result 
    callback(err, result) 
} 

单线程系统有预期的优点。一个是在线程之间没有需要由OS完成的上下文切换,这消除了在系统中执行该任务的开销。

另一方面,这是如何与其他系统和编程语言处理它的方式进行比较的热门话题 - 是使用回调函数作为实现异步性的手段的简单编程。

0