首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Web工作者中发出HTTP请求

在Web工作者中发出HTTP请求
EN

Stack Overflow用户
提问于 2015-05-22 02:31:00
回答 1查看 10.4K关注 0票数 4

我第一次尝试在我的节点应用程序中使用web工作者或线程。我正在使用webworker-线程npm模块

基本上,我希望每个工作人员向服务器发出请求,测量响应时间并将其发送回主线程。

我尝试了很多不同的方法,但我似乎无法让它发挥作用。文档中的基本示例起作用。但是当我试图要求一个模块(在我的例子中是“请求”)时,工作人员似乎停止工作,没有任何错误消息。我在文档中看到,需要在工作人员内部不工作,所以我尝试了"importScripts()",这也不起作用。在使用线程池时,我尝试使用.all.eval(),但它也不起作用。

由于这是第一次在节点中使用web工作者/线程,我可能会误解如何在一般情况下使用这些东西。下面是我尝试过的一个例子:

server.js

代码语言:javascript
复制
var Worker = require('webworker-threads').Worker;
var worker = new Worker('worker.js');

worker.js

代码语言:javascript
复制
console.log("before import");
importScripts('./node_modules/request/request.js');
console.log("after import");

这个基本示例只打印before import,然后停止。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-24 21:00:58

Web工作者只是本机javascript,所以您无法通过他们实现您想要的结果。工作线程不支持node.js api或npm包(比如http或request.js)。对于并发性,您不需要任何多线程魔术,只需使用async.js或承诺即可。如果您想玩线程,那么child_processes就是方法。您还可以使用API来管理child_processes (如https://github.com/rvagg/node-worker-farm )。

考虑到您的示例,您可以编写如下内容:

main.js

代码语言:javascript
复制
var workerFarm = require('worker-farm')
, workers    = workerFarm(require.resolve('./child'))
, ret        = 0;

var urls = ['https://www.google.com', 'http://stackoverflow.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

代码语言:javascript
复制
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);
    });
};
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30387469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档