所以我有一个带有 Socket.IO
的应用程序,其目的是在不同的站点上搜索一些数据。像爬虫之类的东西……主要问题是搜索过程太长,当它发生时我的应用程序卡住了……例如,如果一个用户开始搜索第二个需要等到第一个完成……
每个需要搜索的站点都表示为一个单独的类,所以我会做类似的事情:
selected_sites.forEach(function(site_name) {
var site = new sites[site_name];
site.on('found', function(data) {
socket.emit('found', data);
});
site.on('not_found', function() {
socket.emit('not_found', 'Nothing found at ' + site.getSiteName());
});
site.search(socket_data.params);
});
是否有可能以某种方式将“类主体 | 搜索进度”移动到“其他地方 | 在新线程中”,以便在搜索过程中事件循环不会被阻塞?
最佳答案
node.js 不允许同时运行多个 Javascript 执行线程。单个 node.js 进程一次仅运行一个 Javascript 执行线程。由于异步 I/O,多个 Javascript 操作可能在任何给定时间处于“运行中”,但在任何给定时间实际上只有一个正在运行(而其他可能正在等待 I/O 操作完成)。
解决您希望在后台运行一些运行时间较长和/或 CPU 密集型应用程序而您的服务器可以自由处理传入请求的问题的通常方法是将耗时的操作移至它自己的 node.js进程(通常使用 child process module ),然后允许这两个进程根据需要共享信息,无论是通过数据库还是通过一些进程间通信(如套接字)。
如果您有多个 CPU 密集型操作,您可以启动多个辅助进程,或者您可以使用 node.js clustering module以便最大限度地利用主机中的所有 CPU。
您应该知道,如果您的大部分代码只是网络或文件 I/O,那么这些都可以通过异步操作来完成,并且您的 node.js 服务器可以很好地扩展以并行执行许多不同的事情。如果您有 CPU 密集型操作(大量解析或计算),那么您将希望启动多个进程以便更有效地利用多个 CPU 并让系统为您分时工作。
2020 年更新:Nodejs 现在具有线程。您可以使用 Worker Threads .这不需要并行化 I/O 操作,但对于并行化 CPU 密集型操作和利用多个 CPU 内核可能很有用。
关于node.js - 是否有可能以某种方式在 NodeJS 中进行多线程处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36505666/