您当前的位置:首页 > 互联网教程

nodejs是单线程还是多线程

发布时间:2025-05-19 14:13:57    发布人:远客网络

nodejs是单线程还是多线程

一、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还支持多线程操作,可以同时执行多个任务,提高效率和性能。这些功能的结合使用,可以实现更复杂和多样化的自动化脚本。

三、如何使用nodejs做爬虫程序

1、如果是定向爬取几个页面,做一些简单的页面解析,爬取效率不是核心要求,那么用什么语言差异不大。

当然要是页面结构复杂,正则表达式写得巨复杂,尤其是用过那些支持xpath的类库/爬虫库后,就会发现此种方式虽然入门门槛低,但扩展性、可维护性等都奇差。因此此种情况下还是推荐采用一些现成的爬虫库,诸如xpath、多线程支持还是必须考虑的因素。

2、如果是定向爬取,且主要目标是解析js动态生成的内容

此时候,页面内容是有js/ajax动态生成的,用普通的请求页面->解析的方法就不管用了,需要借助一个类似firefox、chrome浏览器的js引擎来对页面的js代码做动态解析。

此种情况下,推荐考虑casperJS+phantomjs或slimerJS+phantomjs,当然诸如selenium之类的也可以考虑。

3、如果爬虫是涉及大规模网站爬取,效率、扩展性、可维护性等是必须考虑的因素时候

大规模爬虫爬取涉及诸多问题:多线程并发、I/O机制、分布式爬取、消息通讯、判重机制、任务调度等等,此时候语言和所用框架的选取就具有极大意义了。

PHP对多线程、异步支持较差,不建议采用。

NodeJS:对一些垂直网站爬取倒可以,但由于分布式爬取、消息通讯等支持较弱,根据自己情况判断。

Python:强烈建议,对以上问题都有较好支持。尤其是Scrapy框架值得作为第一选择。优点诸多:支持xpath;基于twisted,性能不错;有较好的调试工具;

此种情况下,如果还需要做js动态内容的解析,casperjs就不适合了,只有基于诸如chrome V8引擎之类自己做js引擎。

至于C、C++虽然性能不错,但不推荐,尤其是考虑到成本等诸多因素;对于大部分公司还是建议基于一些开源的框架来做,不要自己发明轮子,做一个简单的爬虫容易,但要做一个完备的爬虫挺难的。

像我搭建的微信公众号内容聚合的网站就是基于Scrapy做的,当然还涉及消息队列等。可以参考下图:

具体内容可以参考一个任务调度分发服务的架构