在 Web Worker 中发起 HTTP 请求
Make HTTP request inside Web Worker
我第一次尝试在我的节点应用程序中使用网络工作者或线程。我正在使用 webworker-threads npm module.
基本上我希望每个工作人员向服务器发出请求,测量响应时间并将其发送回主线程。
我尝试了很多不同的方法,但我似乎无法让它工作。文档中的基本示例有效。但是当我尝试要求一个模块时(在我的例子中是"request"),工作人员似乎只是停止工作,没有任何错误消息。我在文档中看到 require 在 worker 中不起作用,所以我尝试了 "importScripts()",这也不起作用。使用线程池时,我尝试使用 .all.eval() 但它也没有用。
由于这是第一次在 node 中使用 web-workers / threads,我可能会误解一般如何使用这些东西。这是我试过的一个例子:
server.js
var Worker = require('webworker-threads').Worker;
var worker = new Worker('worker.js');
worker.js
console.log("before import");
importScripts('./node_modules/request/request.js');
console.log("after import");
这个基本示例只打印 before import
然后停止。
Web worker 是原生的 javascript 只是你无法用它们实现你想要的。工作线程不支持 node.js api 或 npm 包(如 http 或 request.js)。对于并发,您不需要任何多线程魔法,只需使用 async.js 或承诺。如果你想玩线程,那么 child_processes 就是你要走的路。您还可以使用 API 来管理 child_processes,例如 https://github.com/rvagg/node-worker-farm
考虑到您的示例,您可以这样写:
main.js
var workerFarm = require('worker-farm')
, workers = workerFarm(require.resolve('./child'))
, ret = 0;
var urls = ['https://www.google.com', 'http://whosebug.com/', 'https://github.com/'];
urls.forEach(function (url) {
workers(url, function (err, res, body, responseTime) {
console.log('Url ' + url + 'finished in ' + responseTime + 'ms');
//Ugly code here use async/promise instead
if (++ret == urls.length)
workerFarm.end(workers);
});
});
child.js
var request = require('request');
module.exports = function(url, cb) {
var start = new Date();
request(url, function(err, res, body) {
var responseTime = new Date() - start;
cb(err, res, body, responseTime);
});
};
我第一次尝试在我的节点应用程序中使用网络工作者或线程。我正在使用 webworker-threads npm module.
基本上我希望每个工作人员向服务器发出请求,测量响应时间并将其发送回主线程。
我尝试了很多不同的方法,但我似乎无法让它工作。文档中的基本示例有效。但是当我尝试要求一个模块时(在我的例子中是"request"),工作人员似乎只是停止工作,没有任何错误消息。我在文档中看到 require 在 worker 中不起作用,所以我尝试了 "importScripts()",这也不起作用。使用线程池时,我尝试使用 .all.eval() 但它也没有用。
由于这是第一次在 node 中使用 web-workers / threads,我可能会误解一般如何使用这些东西。这是我试过的一个例子:
server.js
var Worker = require('webworker-threads').Worker;
var worker = new Worker('worker.js');
worker.js
console.log("before import");
importScripts('./node_modules/request/request.js');
console.log("after import");
这个基本示例只打印 before import
然后停止。
Web worker 是原生的 javascript 只是你无法用它们实现你想要的。工作线程不支持 node.js api 或 npm 包(如 http 或 request.js)。对于并发,您不需要任何多线程魔法,只需使用 async.js 或承诺。如果你想玩线程,那么 child_processes 就是你要走的路。您还可以使用 API 来管理 child_processes,例如 https://github.com/rvagg/node-worker-farm
考虑到您的示例,您可以这样写:
main.js
var workerFarm = require('worker-farm')
, workers = workerFarm(require.resolve('./child'))
, ret = 0;
var urls = ['https://www.google.com', 'http://whosebug.com/', 'https://github.com/'];
urls.forEach(function (url) {
workers(url, function (err, res, body, responseTime) {
console.log('Url ' + url + 'finished in ' + responseTime + 'ms');
//Ugly code here use async/promise instead
if (++ret == urls.length)
workerFarm.end(workers);
});
});
child.js
var request = require('request');
module.exports = function(url, cb) {
var start = new Date();
request(url, function(err, res, body) {
var responseTime = new Date() - start;
cb(err, res, body, responseTime);
});
};