使用Webworkers的Node.js Express应用程序

3
我是一位新手,正在尝试构建一个express应用程序。到目前为止,我已经设置了一个应用程序,并创建了一些基本路由。
我的应用程序入口是一个文件,我在其中使用应用程序设置服务器:
#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('main');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

express应用程序使用mongoose在适当的http请求中与数据库进行通信。
此时,我还需要一个web-worker,当服务器启动时,每5秒生成随机数,并且如果生成的数字是10,则将其识别为事件,并将一些结果存储在数据库中。
我不确定如何开始以及如何将其包含在目前的结构中。
我已经设置了用于向数据库写入等操作的接口。我只是对web-worker实现和集成部分感到困惑。

WebWorkers是一种Web技术(即在浏览器中运行)。Node是一种服务器端技术,不支持WebWorkers。您需要创建一个浏览器应用程序并在其中使用WebWorkers。 - Andrew Eisenberg
为什么需要使用Webworker来生成随机数?而不直接使用设置为5秒的' setInterval() '呢?此外,你发布的代码与生成随机数无关,对于你的问题并没有什么帮助。 - mscdex
这似乎是 setInterval() 的工作。Node.js 中没有内置的 webWorkers。 - jfriend00
我认为我错误地使用了Webworker这个术语。但是下面的代码将解决我想要做的事情。 - autobot
1个回答

2
在node.js中没有webworkers。但我们有类似的东西叫做child_process(请查看文档了解更多详情:链接)。
如何使用child_process?在stackoverflow上有很多资料:https://dev59.com/zGYr5IYBdhLWcg3w0tWE#13371439。在主模块中运行其他模块的解释如下(请查看详情): 在你的主模块中:
var cp = require('child_process');
var child = cp.fork('./othermodulefile');

child.on('message', function(m) {
  // Receive results from child process
  console.log('received: ' + m);
});

// Send child process some work
child.send('Please up-case this string');

或者您可以查看以下链接以获取更多描述:http://www.tutorialspoint.com/nodejs/nodejs_scaling_application.htm 并且从该页面中提取出以下示例代码:

文件:support.js
console.log("Child Process " + process.argv[2] + " executed." );

文件:master.js

const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.exec('node support.js '+i,
      function (error, stdout, stderr) {
         if (error) {
            console.log(error.stack);
            console.log('Error code: '+error.code);
            console.log('Signal received: '+error.signal);
         }
         console.log('stdout: ' + stdout);
         console.log('stderr: ' + stderr);
      });

      workerProcess.on('exit', function (code) {
      console.log('Child process exited with exit code '+code);
   });
}

使用child_process的一些缺点:https://stackoverflow.com/a/17340465/4138339

每个线程都需要内存,这就是为什么大多数传统系统不太可扩展,因为每个客户端都需要一个线程。对于node来说,从硬件资源的角度来看,这将极其低效。

另外:

建议工作进程的数量等于硬件CPU核心数。

如果你需要运行基于时间的作业调度程序,请查看此模块https://github.com/ncb000gt/node-cron。这是一个node.js cron job。安装命令npm install cron,使用示例:

var CronJob = require('cron').CronJob;
new CronJob('* * * * * *', function() {
  console.log('You will see this message every second');
}, null, true, 'America/Los_Angeles');

1
非常感谢。这正是我一直在寻找的。还要非常感谢您包含了链接。让我的生活变得更加轻松 :) - autobot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接