所以我有一个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);
});
是否有可能以某种方式将“类体|搜索进度”“移动到新线程的其他位置”,以便在搜索过程中不阻止事件循环?
答案 0 :(得分:4)
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,并让系统时间为您完成工作。
答案 1 :(得分:1)
NodeJS是单线程的,但您可以创建集群。我建议阅读:http://www.sitepoint.com/how-to-create-a-node-js-cluster-for-speeding-up-your-apps/
通过这种方式,您可以共享服务器句柄并使用进程间通信与父节点进程进行通信。
答案 2 :(得分:1)
所以你有几个选择。根据搜索功能的确切功能,其中一个选项可以发挥最佳效果:
Node.js child processes
异步编写search
方法。如果它是用javascript实现的,那么应该可以使用process.nextTick(See this question);如果它是一个C / C ++实现,它会更复杂,并且子进程可能是要走的路。
答案 3 :(得分:0)
由于这个问题已有2年历史了,所以我会对此进行更新。
这里的大多数答案都是基于NodeJS是单线程的说法,这只是部分正确。
NodeJS是由事件驱动的,具有单线程事件循环。尽管情况仍然如此,但最近以所谓的Worker-Threads的形式扩展了NodeJS的多线程支持(自NodeJS v10.5.0起)。
这些功能仍处于试验阶段,因此暂时坚持使用Child Processes可能更好。
我只想对此进行更新,since NodeJS is now considered multithreaded。