利用nodejs 执行多个js 脚本,casperjs 同行执行多个任务

需求背景:

在利用casperjs 在爬数据的时候需要爬多个数据,如果所有的的脚本写在一个js 里面,就不利于维护,以及后期的新功能的增加。现在就是要把一个类只做一件事情,例如 Hello.js 只负责打印 Hello。这样就会涉及到需要同时启动几个任务。例如,baidu.js 负责爬百度的数据,google.js 只负责爬谷歌的数据。现在需要用一条脚本同时启动两个文件去爬数据。

需求分析:

1.casperjs 在终端 通过 敲 casperjs xx.js 来执行的,调用了python 的环境。本质上执行了exec 的命令,如果在linux 系统上的话还需要给执行的文件加相对应的权限。

2.首先让index.js 可以直接执行 a.js

3.利用node 子线程去启动

a.js 简单写一句:

console.log('hello')
复制代码

index.js:

var exec = require('child_process').exec;

var child = exec('node ' + 'a.js', function(err, stdout, stderr) {
  if (err) throw err;
  console.log(stdout);
});

复制代码

b.js

console.log('I am b.js');
复制代码

同时执行 a.js 和 b.js

var exec = require('child_process').exec;

var child = exec('node ' + 'a.js', function(err, stdout, stderr) {
  if (err) throw err;
  console.log(stdout);
});

var child2 = exec('node ' + 'b.js', function(err, stdout, stderr) {
  if (err) throw err;
  console.log(stdout);
});
复制代码

4.通过shelljs 模块来执行shell 脚本 需要安装

npm install --save shelljs
复制代码

例子:

var shell = require("shelljs");

shell.exec("node a.js ");
复制代码

存在问题,解决了shell 命令调用,参数调用还欠缺

5.通过yargs 模块,可以解决处理命令行参数

var argv = require('yargs').argv;

console.log('url is  ', argv.url)
复制代码

执行:

node yargs.js --url=www.baidu.com
复制代码

解决方案:

1.通过require('child_process').exec; 调用

2.通过 shelljs 模块

3.通过 yargs 模块调用

总结:

可以根据业务具体需求,来决定用哪一种解决方案,看那一个更适合自己的团队。

转载于:https://juejin.im/post/5a4d95226fb9a04504084a36

Node.js 中可以使用多种方法让多个函数同时执行,特别是在需要处理 I/O 密集型操作(例如文件系统、网络请求)时,因为 Node.js 的单线程模型适合于这样的场景,通过事件循环机制(Event Loop)实现了非阻塞 I/O。以下是几种常见的并发执行方法: 1. **Promise.all()**:当你有一组 Promise 实例,想要等待所有 Promise 结束后再继续执行后面的代码,可以使用 `Promise.all()`。这个方法接收一个 Promise 数组,当所有 Promise 都 resolve 或 reject 时,返回一个新的 Promise,其状态取决于第一个完成的 Promise。 ```javascript const promises = [ doSomethingAsync(), doSomethingElseAsync() ]; Promise.all(promises).then(results => { // 所有任务完成后,results 就包含了所有 Promise 的结果 }).catch(err => { // 任一 Promise 错误都会触发这个 catch }); ``` 2. **async/await**:结合 `async` 函数和 `await` 关键字,可以在函数内部暂停执行,直到 Promise 解决。`await` 后面跟随的 Promise 将在当前作用域内等待,其他任务将继续执行。 ```javascript async function executeParallel() { try { const [result1, result2] = await Promise.all([ doSomethingAsync(), doSomethingElseAsync() ]); // 在此处处理结果 } catch (err) { console.error(err); } } executeParallel(); ``` 3. **Worker Threads**:从 Node v10 开始,引入了 worker_threads 模块,可以在主进程之外创建独立的线程运行耗时任务,提高性能。但是需要注意通信成本和同步问题。 4. **第三方库**:还可以使用第三方库,如 `concurrently`,它能让你在命令行界面看到各个任务执行情况,例如 `npm run task1 && npm run task2`. 无论哪种方法,都旨在利用 Node.js 的非阻塞特性,使多个任务能够并发执行,提高程序的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值