Улучшено управление внешними конвертерами

This commit is contained in:
Book Pauk
2020-12-03 19:04:34 +07:00
parent 39c3bf17dd
commit 4a527d192d
3 changed files with 22 additions and 4 deletions

View File

@@ -6,7 +6,7 @@ const LimitedQueue = require('../../LimitedQueue');
const textUtils = require('./textUtils'); const textUtils = require('./textUtils');
const utils = require('../../utils'); const utils = require('../../utils');
const queue = new LimitedQueue(2, 20, 3*60*1000);//3 минуты ожидание подвижек const queue = new LimitedQueue(3, 20, 3*60*1000);//3 минуты ожидание подвижек
class ConvertBase { class ConvertBase {
constructor(config) { constructor(config) {
@@ -44,12 +44,17 @@ class ConvertBase {
try { try {
const result = await utils.spawnProcess(path, { const result = await utils.spawnProcess(path, {
killAfter: 600, killAfter: 3600,//1 час
args, args,
onData: (data) => { onData: (data) => {
q.resetTimeout(); q.resetTimeout();
onData(data); onData(data);
}, },
//будем периодически проверять работу конвертера и если очереди нет, то разрешаем работу пинком onData
onUsage: (stats) => {
if (queue.freed > 1 && stats.cpu >= 10)
onData('.');
},
abort abort
}); });
if (result.code != 0) { if (result.code != 0) {

View File

@@ -130,6 +130,7 @@ class ReaderWorker {
convertFilename = `${this.config.tempDownloadDir}/${tempFilename2}`; convertFilename = `${this.config.tempDownloadDir}/${tempFilename2}`;
await this.bookConverter.convertToFb2(decompFiles, convertFilename, opts, progress => { await this.bookConverter.convertToFb2(decompFiles, convertFilename, opts, progress => {
wState.set({progress}); wState.set({progress});
q.resetTimeout();
}, q.abort); }, q.abort);
//сжимаем файл в tmp, если там уже нет с тем же именем-sha256 //сжимаем файл в tmp, если там уже нет с тем же именем-sha256

View File

@@ -3,6 +3,7 @@ const fs = require('fs-extra');
const path = require('path'); const path = require('path');
const crypto = require('crypto'); const crypto = require('crypto');
const baseX = require('base-x'); const baseX = require('base-x');
const pidusage = require('pidusage');
const BASE36 = '0123456789abcdefghijklmnopqrstuvwxyz'; const BASE36 = '0123456789abcdefghijklmnopqrstuvwxyz';
const bs36 = baseX(BASE36); const bs36 = baseX(BASE36);
@@ -46,10 +47,11 @@ async function touchFile(filename) {
} }
function spawnProcess(cmd, opts) { function spawnProcess(cmd, opts) {
let {args, killAfter, onData, abort} = opts; let {args, killAfter, onData, onUsage, onUsageInterval, abort} = opts;
killAfter = (killAfter ? killAfter : 120);//seconds killAfter = (killAfter ? killAfter : 120);//seconds
onData = (onData ? onData : () => {}); onData = (onData ? onData : () => {});
args = (args ? args : []); args = (args ? args : []);
onUsageInterval = (onUsageInterval ? onUsageInterval : 30);//seconds
return new Promise((resolve, reject) => { (async() => { return new Promise((resolve, reject) => { (async() => {
let resolved = false; let resolved = false;
@@ -76,9 +78,19 @@ function spawnProcess(cmd, opts) {
reject({status: 'error', error, stdout, stderr}); reject({status: 'error', error, stdout, stderr});
}); });
//ждем процесс, контролируем его работу раз в секунду
let onUsageCounter = onUsageInterval;
while (!resolved) { while (!resolved) {
await sleep(1000); await sleep(1000);
killAfter -= 1;
onUsageCounter--;
if (onUsage && onUsageCounter <= 0) {
const stats = await pidusage(proc.pid);
onUsage(stats);
onUsageCounter = onUsageInterval;
}
killAfter--;
if (killAfter <= 0 || (abort && abort())) { if (killAfter <= 0 || (abort && abort())) {
process.kill(proc.pid); process.kill(proc.pid);
if (killAfter <= 0) { if (killAfter <= 0) {