nodejs实现多进程(cluster 模式)
发布时间:2025-05-23 18:01:46 发布人:远客网络
一、nodejs实现多进程(cluster 模式)
1、Nodejs的主进程是单线程的,但它有多线程处理方案(更准备来说是多进程方案),即主进程开启不同的子进程,主进程接收所有请求,然后将分发给其它不同的nodejs子进程处理。
2、 Nodejs的 cluster模式用的就是第一种实现,它使用一个主线程 master和多个子线程 worker,形成一个集群,通过主线程来向子线程分发请求。cluster实现了对 child_process的封装,通过 fork方法创建子进程的方式实现了多进程模型。
3、 http和 cluster、 process都是 nodejs的内置模块,不需要额外安装
4、实现过程大概是这样的: cluster模块应用 child_process来创建子进程,子进程通过复写掉 cluster._getServer方法,从而在 server.listen来保证只有主进程监听端口,主子进程通过 IPC进行通信,其次主进程根据平台或者协议不同,应用两种不同模块( round_robin_handle.js和 shared_handle.js)进行请求分发给子进程处理。
5、 PM2是后台进程管理器,是多进程方案的一个成熟应用,可以帮助管理和保持应用程序在线。
6、全局安装: npm install pm2@latest-g
7、 PM2对nodejs应用,可以根据系统自动实现负载均衡: pm2 start http-server.js-i max
8、我们肯定不想每次启动时,都要手动输入一堆指令,所以我们可以将这些配置统一使用配置文件来管理,注意js文件名必须是 xxx.config.js,我这里用 ecosystem.config.js:
9、 apps数组中,可以放置多个对象,对应多个文件执行不同的配置
10、执行配置: pm2 start ecosystem.config.js--env dev
11、可以看到在启动后,桌面上生成了流水和错误日志:
二、nodejs是单线程还是多线程
1、Node.js的主要思路是:使用非阻塞的,事件驱动的 I/O操作来保持在处理跨平台(across distributed devices)数据密集型实时应用时的轻巧高效。这听起来有点绕口。
2、它的真正含义是,Node.js不是一个即将主导Web开发的世界的银弹级的平台。相反,它是一个满足特别需求的平台。你肯定不会希望使用 Node.js去做 CPU密集型操作。事实上,使用它进行繁重的计算等于摒弃 Node几乎所有的优点。Node真正的亮点在于建设高性能,高扩展性的互联网应用——因为它能够处理庞大的并且高吞吐量的并发连接。
3、它的工作原理是相当有趣的。传统的网络服务技术,是每个新增一个连接(请求)便生成一个新的线程,这个新的线程会占用系统内存,最终会占掉所有的可用内存。而 Node.js仅仅只运行在一个单线程中,使用非阻塞的异步 I/O调用,所有连接都由该线程处理,在 libuv的加分下,可以允许其支持数万并发连接(全部挂在该线程的事件循环中)。
4、做一个简单的计算:假设是普通的Web程序,新接入一个连接会占用2M的内存,在有 8GB RAM的系统上运行时,算上线程之间上下文切换的成本,并发连接的最大理论值则为 4000个。这是在传统 Web服务端技术下的处理情况。而 Node.js则达到了约 1M一个并发连接的拓展级别(相关证明).
5、当然,在所有客户端的请求共享单一线程时也会有问题,这也是一个编写 Node.js应用的潜在缺陷.首先,大量的计算可能会使得 Node的单线程暂时失去反应,并导致所有的其他客户端的请求一直阻塞,直到计算结束才恢复正常。其次,开发人员需要非常小心,不要让一个 Exception阻塞核心的事件循环,因为这将导致 Node.js实例的终止(实际上就是程序崩溃)。(笔者注:如 PHP中某个页面挂掉是不会影响网站运行的,但是 Nodejs是一个线程一个线程来处理所有的链接,所以不论是计算卡了或者是被异常阻塞了都可能会影响到其他所有的链接。解决方案在稍后讨论。)
三、auto.js多线程如何根据颜色提取元素
autojs是一款基于JavaScript的Android自动化工具,它提供了多线程的功能,可以在脚本中同时执行多个任务。在autojs中,根据颜色提取元素可以通过颜色识别功能实现。
1.使用autojs的captureScreen函数获取当前屏幕的截图。
2.使用getImagePixel函数获取指定位置的像素颜色值。
3.判断获取的颜色值是否与目标颜色相匹配。可以使用RGB色彩模式或者HSV色彩模式进行颜色匹配,根据实际需求选择合适的方式。
4.如果颜色匹配成功,则可以执行相应的操作,比如点击该元素或者进行其他的自动化操作。
原因是,通过根据颜色提取元素,可以实现对指定区域或者特定元素的自动化操作。这在一些需要根据特定颜色进行判断和交互的场景中非常有用。比如,在游戏中根据特定颜色判断某个物品是否出现,或者在应用中根据颜色判断某个按钮是否可点击等。
拓展内容:除了根据颜色提取元素,autojs还提供了其他的元素识别和交互功能,比如根据坐标识别元素、根据文字识别元素等。通过这些功能,可以实现更加灵活和精确的自动化操作。同时,autojs还支持多线程操作,可以同时执行多个任务,提高效率和性能。这些功能的结合使用,可以实现更复杂和多样化的自动化脚本。