// monitors which process is currently running // kills it if need be.... murder import { spawn } from 'child_process' import interpreters from './interpreters' import modules from './modules' import { kill } from 'tree-kill' var state = { current_cpu_task: null, current_gpu_task: null, } export function get_current_cpu_task(){ return state.current_cpu_task } export function get_current_gpu_task(){ return state.current_gpu_task } export function build_params(module, task) { const activity = module.activities[task.activity] const interpreter = interpreters[activity.type] if (typeof activity.params === 'function') { params = activity.params(task) } else { const opt = JSON.parse(task.opt) const opt_params = Object.keys(opt).map(key => { const flag = '--' + key.replace(/-/g, '_') const value = opt[key] if (value === 'true') { return [flag] } return [flag, value] }).reduce((acc, cur) => acc.concat(cur), []) params = [ activity.script ].concat(activity.params || []).concat(opt_params) } return { activity, params } } export function run_task(module_name, task){ const module = modules['module_name'] if (! module) throw new Error("No such module") const { activity, interpreter, params } = build_params(module, task) console.log('running task', activity.name) console.log(activity.interpreter, params) const subprocess = spawn(activity.interpreter, params) if (activity.gpu) { state.current_gpu_task = subprocess } else { state.current_cpu_task = subprocess } subprocess.on('error', (err) => { console.log('process error', subprocess.pid, err) }) subprocess.on('close', () => { console.log('process ended', subprocess.pid) }) } export function kill_task(subprocess){ kill(subprocess.pid) }