【魄爺】 发表于 2017-2-21 12:42:06

Nodejs异步和事件

  node.js是单线程。
  好处就是
  1)简单
  2)高性能,避免了频繁的线程切换开销
  3)占用资源小,因为是单线程,在大负荷情况下,对内存占用仍然很低
  3)线程安全,没有加锁、解锁、死锁这些问题
  Node.js是单线程的,它通过事件轮询(event loop)来实现并行操作。可以在不新增额外线程的情况下,依然可以对任务进行并行处理。
  Node.js 借助事件驱动,非阻塞I/O 模型变得轻量和高效, 非常适合 运行在分布式设备 的 数据密集型 的实时应用。V8引擎执行Javascript的速度非常快,性能非常好。
  非阻塞I/O和阻塞I/O分析:
  我们可以将同步I/O称为阻塞I/O,非阻塞I/O称为异步I/O。同步I/O当请求发出之后,应用程序就会阻塞,直到请求满足为止;非阻塞I/O允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。
  在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。
  非阻塞I/O的程序一般是单线程的,因此,服务端接收的客户端请求数并不随着工作线程数的增加而增加。所以使用非阻塞I/O模式就不会受到操作系统对线程总数的限制,也不会 占用大量的服务器资源。
  非阻塞I/O和同步I/O最明显的不同就是同步I/O所有可能被阻塞的地址在非阻塞I/O中都不会被阻塞。如在读取数据时,如果数据暂时无法被读取。那么 在非阻塞I/O中会立刻返回,以便程序可以执行其他的代码,然后系统会不断侦测这个未完成的读取操作,直到可以继续读数据时再来完成这个操作。
  如:file.txt的内容是:hello world
  非阻塞:
  

 
  其输出的结果是
  end,
  hello world
  程序不会等待文件读取,而是继续执行输出end,等到文件读取完成后就会回调响应函数,输出hello world
  阻塞
  

 
  其结果是:
  hello world
  end.
  程序会等待文本读取完毕输出读取结果后再往下面执行,输出end。
  结果分析:
  非阻塞I/O发送请求后立即返回执行后面的语句,执行完以后进入时间循环监听,当fs接受到I/O请求完成事件时,事件循环会主动调用 回调函数执行后续工作,同步则是阻塞等待完成后,再继续执行。
  自定义事件:
  例一:
  

 
  例二:
  

 运行结果:
  

 依次执行了。
  

 
页: [1]
查看完整版本: Nodejs异步和事件