关于Process,我们需要讨论两个概念,①操作系统的进程,②Node.js中的Process对象。操作流程之于服务器,就如同html之于前端一样。要想做服务端编程,绕过Unix/Linux是不可能的。在Linux/Unix/Mac系统中运行ps-ef命令可以查看当前系统运行的进程。参数如下:apiNode.js中常见的流程对象。可以直接在代码中通过console.log(process)打印出来。您可以看到流程对象公开了许多有用的属性和方法。具体可以看官方文档,里面有详细的介绍。其中包括但不限于:流程基本信息流程使用流程级别事件相关模块/版本信息操作系统基本信息账户信息信号发送和接收三种标准流官方文档:https://nodejs.org/api/proces...process是一个global全局对象,提供控制当前Node.js进程的信息。作为一个对象,它始终对Node.js应用程序可用,因此无需使用require()。process这个对象是EventEmitter的一个实例。process.env.NODE_PATH获取系统中环境变量中设置的内容:__dirname:获取当前文件所在路径:process.nextTick┌──────────────────────────────────────┐┌──>│定时器││└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────┐││I/O回调││└──────────────────────────────────────┘│┌────────────┴──────────────┐││空闲,准备││└──────────────┬────────────────┘┌──────────────────┐│┌──────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐┐│││投票│<──────┤连接,││└────────────┬─────────────────┘│资料等││┌────────────┴────────────────┐└────────────────────────────────┘││检查││└──────────────┬────────────────┘│┌────────────┴──────────────────────────────┐└──┤关闭回调│└────────────────────────────────┘process.nextTick不属于Event循环中的某个阶段,但是在Event循环的每个阶段结束后,直接执行插入到nextTickQueue中的“Tick”,直到处理完整个Queue。具体的api按照文档看,标准输入输出流也暴露了process对象上的process.stderr、process.stdout和process.stdin标准流,熟悉C/C++/Java的同学应该比较熟悉用它。console.log是同步的还是异步的?骗子sole.log既不总是同步的也不总是异步的。是否同步取决于连接的是什么流以及操作系统是Windows还是POSIX:注意:同步写入会阻塞事件循环,直到写入完成。有时候可能一瞬间就可以写入一个文件,但是当系统负载高的时候,管道的接收端可能读不到,慢终端或者文件系统,因为事件循环被阻塞的次数足够多而且时间长了,这些可能会对系统性能产生负面影响。当您写入交互式终端会话时,这可能不是问题,但在生成日志到进程输出流时要特别小心。Files:Windows和POSIX平台都是同步Terminals(TTYs):Windows平台下同步,POSIX平台下异步管道(Pipes):Windows平台下同步,POSIX平台下异步如何实现一个控制台。日志?实现在控制台打印console.log,使用process.stdout将输入流数据输出到输出流(即输出到终端),一个简单的例子输出helloworldprocess.stdout.write('helloworld!'+'n');,下面的例子是解释和实现控制台源代码,并命名为ConsoleLogger。https://www.imooc.com/article...关于进程I/O的一个注意事项这里有一个计算器的例子:跨系统node.js提供了os.platform()或process.platform来检测当前系统的os。platformorprocess.platformreturns'darwin','freebsd','linux','sunos'or'win32'[多进程架构]Node的线程池有一些IO操作(DNS,FS)和一些CPU在Node密集计算(zlib,Crypto)会启用Node的线程池,线程池默认大小为4手动更改线程池默认大小:process.env.UV_THREADPOOL_SIZE=64clustercluster是多线程的吗?Node的单线程也带来了一些问题,比如cpu利用率不足,一个未捕获的异常可能导致整个程序退出等等。由于Node中提供了cluster模块,cluster实现了对child_process的封装,通过fork方法创建子进程实现多进程模型。比如我们最常用的pm2就是最好的代表之一。一共有9个进程,其中一个是主进程,cpus个数xcpu核数=2x4=8个子进程。numCPUs=8,所以无论child_process还是cluster,都不是多线程模型,而是多进程模型。虽然开发者意识到了单线程模型的问题,但是并没有从根本上解决问题,而是提供了多进程的方法来模拟多线程。从前面的实验可以看出,虽然Node(V8)本身具有多线程能力,但是开发者并不能很好的利用这个能力,更多的是Node底层提供的使用多线程。Node官方表示:可以通过开发C++插件来使用内置的NodeWorkerPool。在旧版本的Node上,使用NAN构建你的C++插件,在新版本上使用N-API。node-webworker-threads提供了一种仅使用JavaScript的方式来访问Node的工作池。在Node10.5.0发布之前,对于JavaScript开发者来说,一直没有标准易用的方式来使用Node的多线程能力。随着worker_threadsNode10.5.0的发布,正式发布了一个实验模块worker_threads,为Node提供真正的多线程能力。jin参考:Node.js的进程管理:https://segmentfault.com/a/11...Areyouhungryprocesstrue-Nodemultithreading
