multi-tasks 3.5.2 → 4.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/workers/helper.js CHANGED
@@ -1,77 +1,77 @@
1
- let fs = require('fs');
2
- let pathutil = require('path');
3
-
4
- let TaskMgr = require('./TaskMgr');
5
- let IpcTaskStore = require('./IpcTaskStore');
6
- let runLog = require('../utils/runLog');
7
-
8
- let myconfig;
9
- let listeners = {};//event -> handler, worker 进程内模块级广播监听 registry(每个 event 一个 handler)
10
-
11
- const load = (config)=>{
12
- myconfig = config;
13
- };
14
- const createNewTasks = (tasks)=>{
15
- if (!myconfig) throw new Error('Please call helper.load(config) first!');
16
- if (!Array.isArray(tasks)) tasks = [tasks];
17
- if(myconfig.task_storage === 'memory'){
18
- //memory 档 worker 不碰盘: 每个动态任务一条 createTask 消息即时发 master(逐条同构, 禁止缓冲攒批)
19
- IpcTaskStore.load(myconfig);
20
- tasks.forEach((task)=>{
21
- runLog.write('Creating new task', task)
22
- IpcTaskStore.createNewTask(task);
23
- });
24
- return;
25
- };
26
- TaskMgr.load(myconfig);
27
- tasks.forEach((task)=>{
28
- runLog.write('Creating new task', task)
29
- TaskMgr.createNewTask(task);
30
- });
31
- };
32
-
33
- //广播事件给所有 worker(经 master 中转); option.includingMe 默认 true(也发给自己)
34
- const emit = (event, payload, option)=>{
35
- if (typeof event !== 'string' || !event) throw new Error('helper.emit: event must be a non-empty string');
36
- if (typeof process.send !== 'function') throw new Error('helper.emit: broadcast is only available in worker processes');
37
- let includingMe = !option || option.includingMe !== false;
38
- process.send({__broadcast: true, event, payload, includingMe});
39
- };
40
- //发送系统事件给 master(master 自己消费, 不转发); 内建事件 TERMINATE_ALL_WORKERS,
41
- //其余交给 config.setSysListener
42
- const emitSys = (event, payload)=>{
43
- if (typeof event !== 'string' || !event) throw new Error('helper.emitSys: event must be a non-empty string');
44
- if (typeof process.send !== 'function') throw new Error('helper.emitSys: system events are only available in worker processes');
45
- process.send({__sysEvent: true, event, payload});
46
- };
47
- //监听广播事件, 每个 event 每个 worker 进程只保留一个 handler(重复注册覆盖),
48
- //handler 签名 (payload, meta), meta 含 fromWorkerId/fromWorkerPid
49
- const setListener = (event, handler)=>{
50
- if (typeof event !== 'string' || !event) throw new Error('helper.setListener: event must be a non-empty string');
51
- if (typeof handler !== 'function') throw new Error('helper.setListener: handler must be a function');
52
- listeners[event] = handler;
53
- };
54
- //任务日志: 一律写 <taskFolder>/.sys/run.log; progressBar 未开/非 TTY 回退时 echo 上屏(效果等同 console.log)
55
- const log = (...args)=>{
56
- runLog.write(...args);
57
- };
58
- //内部方法: 供 subWorker 收到 master 中转的广播时调用, 按 event 分发
59
- const __dispatchBroadcast = (message)=>{
60
- let {event, payload, meta} = message;
61
- let handler = listeners[event];
62
- if (!handler) return;
63
- try{
64
- handler(payload, meta);
65
- }catch(e){
66
- runLog.error(`[Broadcast] handler for event "${event}" threw:`, e);
67
- }
68
- };
69
- module.exports = {
70
- load,
71
- createNewTasks,
72
- emit,
73
- emitSys,
74
- setListener,
75
- log,
76
- __dispatchBroadcast
77
- };
1
+ let fs = require('fs');
2
+ let pathutil = require('path');
3
+
4
+ let TaskMgr = require('./TaskMgr');
5
+ let IpcTaskStore = require('./IpcTaskStore');
6
+ let runLog = require('../utils/runLog');
7
+
8
+ let myconfig;
9
+ let listeners = {};//event -> handler, worker 进程内模块级广播监听 registry(每个 event 一个 handler)
10
+
11
+ const load = (config)=>{
12
+ myconfig = config;
13
+ };
14
+ const createNewTasks = (tasks)=>{
15
+ if (!myconfig) throw new Error('Please call helper.load(config) first!');
16
+ if (!Array.isArray(tasks)) tasks = [tasks];
17
+ if(myconfig.task_storage !== 'file'){
18
+ //memory/aof 档 worker 不碰盘: 每个动态任务一条 createTask 消息即时发 master(逐条同构, 禁止缓冲攒批)
19
+ IpcTaskStore.load(myconfig);
20
+ tasks.forEach((task)=>{
21
+ runLog.write('Creating new task', task)
22
+ IpcTaskStore.createNewTask(task);
23
+ });
24
+ return;
25
+ };
26
+ TaskMgr.load(myconfig);
27
+ tasks.forEach((task)=>{
28
+ runLog.write('Creating new task', task)
29
+ TaskMgr.createNewTask(task);
30
+ });
31
+ };
32
+
33
+ //广播事件给所有 worker(经 master 中转); option.includingMe 默认 true(也发给自己)
34
+ const emit = (event, payload, option)=>{
35
+ if (typeof event !== 'string' || !event) throw new Error('helper.emit: event must be a non-empty string');
36
+ if (typeof process.send !== 'function') throw new Error('helper.emit: broadcast is only available in worker processes');
37
+ let includingMe = !option || option.includingMe !== false;
38
+ process.send({__broadcast: true, event, payload, includingMe});
39
+ };
40
+ //发送系统事件给 master(master 自己消费, 不转发); 内建事件 TERMINATE_ALL_WORKERS,
41
+ //其余交给 config.setSysListener
42
+ const emitSys = (event, payload)=>{
43
+ if (typeof event !== 'string' || !event) throw new Error('helper.emitSys: event must be a non-empty string');
44
+ if (typeof process.send !== 'function') throw new Error('helper.emitSys: system events are only available in worker processes');
45
+ process.send({__sysEvent: true, event, payload});
46
+ };
47
+ //监听广播事件, 每个 event 每个 worker 进程只保留一个 handler(重复注册覆盖),
48
+ //handler 签名 (payload, meta), meta 含 fromWorkerId/fromWorkerPid
49
+ const setListener = (event, handler)=>{
50
+ if (typeof event !== 'string' || !event) throw new Error('helper.setListener: event must be a non-empty string');
51
+ if (typeof handler !== 'function') throw new Error('helper.setListener: handler must be a function');
52
+ listeners[event] = handler;
53
+ };
54
+ //任务日志: 一律写 <taskFolder>/.sys/run.log; progressBar 未开/非 TTY 回退时 echo 上屏(效果等同 console.log)
55
+ const log = (...args)=>{
56
+ runLog.write(...args);
57
+ };
58
+ //内部方法: 供 subWorker 收到 master 中转的广播时调用, 按 event 分发
59
+ const __dispatchBroadcast = (message)=>{
60
+ let {event, payload, meta} = message;
61
+ let handler = listeners[event];
62
+ if (!handler) return;
63
+ try{
64
+ handler(payload, meta);
65
+ }catch(e){
66
+ runLog.error(`[Broadcast] handler for event "${event}" threw:`, e);
67
+ }
68
+ };
69
+ module.exports = {
70
+ load,
71
+ createNewTasks,
72
+ emit,
73
+ emitSys,
74
+ setListener,
75
+ log,
76
+ __dispatchBroadcast
77
+ };