所以我有一个应用程序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 进程中(通常使用子进程模块 https://nodejs.org/api/child_process.html),然后允许这两个进程根据需要共享信息,无论是通过数据库还是通过某些进程间通信(如套接字)。
如果您有多个 CPU 密集型操作,您可以启动多个辅助进程,或者可以使用Node.js 集群模块 https://nodejs.org/api/cluster.html为了最大限度地利用主机中的所有 CPU。
您应该知道,如果您的大部分代码只是网络或文件 I/O,那么这一切都可以通过异步操作来完成,并且您的 Node.js 服务器将很好地扩展以并行执行许多不同的事情。如果您有 CPU 密集型操作(大量解析或计算),那么您将需要启动多个进程,以便更有效地利用多个 CPU,并让系统时间片为您完成工作。
2020年更新:Nodejs 现在有线程了。您可以使用工作线程 https://nodejs.org/api/worker_threads.html。这对于并行化 I/O 操作不是必需的,但对于并行化 CPU 密集型操作和利用多个 CPU 内核可能很有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)