You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

process_test.js 1.5 kB

4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /**
  2. * @description:
  3. * @author: bubao
  4. * @date: 2021-04-27 23:38:30
  5. * @last author: bubao
  6. * @last edit time: 2021-04-28 10:35:20
  7. */
  8. const Redis = require("ioredis");
  9. const { spawn } = require("child_process");
  10. const config = require("../env.config.js");
  11. const redis = new Redis(config);
  12. //保存被子进程实例数组
  13. var workers = {};
  14. //这里的被子进程理论上可以无限多
  15. // var appsPath = [__dirname+'/service/clickService.js',__dirname+'/service/showService.js'];
  16. var createWorker = function (appPath, i) {
  17. //保存spawn返回的进程实例
  18. var worker = spawn('node', [appPath, i]);
  19. //监听子进程exit事件
  20. worker.on('exit', async function () {
  21. console.info('worker:' + worker.pid + 'exited');
  22. delete workers[worker.pid];
  23. // createWorker(appPath);
  24. if (Object.keys(workers).length === 0) {
  25. console.log(await redis.scard('setTest'));
  26. await redis.del("setTest");
  27. redis.end();
  28. }
  29. });
  30. workers[worker.pid] = worker;
  31. console.info('create worker:' + worker.pid);
  32. };
  33. redis.del("setTest").then(() => {
  34. //启动所有子进程
  35. for (var i = 10; i > 0; i--) {
  36. createWorker(__dirname + '/test.js', i);
  37. }
  38. });
  39. //父进程退出时杀死所有子进程
  40. process.on('exit', async function () {
  41. console.info('parent exit.');
  42. for (var pid in workers) {
  43. workers[pid].kill('SIGHUP');
  44. }
  45. if (Object.keys(workers).length===0&&redis.status!=="end") {
  46. console.log(await redis.scard('setTest'));
  47. await redis.del("setTest");
  48. redis.end();
  49. }
  50. });