Как проверить, завершен ли процесс на сервере?

Пилю приложение, которое на бэке раз в, например, 5 минут выполняет некое асинхронное действие, которое может выполняться разное время. Из-за технических ограничений действие будет запускаться пингованием сервера извне(т.е. цикл, каждая итерация которого запускается пингом сервера. При этом итерация может занимать разное время, иногда больше пяти минут). Как проверить при пинге, завершился предыдущий цикл или нет? Или может есть более разумное решение?
  • Вопрос задан
  • 154 просмотра
Пригласить эксперта
Ответы на вопрос 4
Семафор: записывать process_id (pid) в текстовый файл.
Обработчик пинга смотрит, есть ли файл, читает из него pid и смотрит, жив ли такой процесс. Если нет – запускает задачу и записывает её pid в файл.
При завершении обработки задачи файл удаляется.
Ответ написан
@aarifkhamdi
ваш бэкенд сам может определить завершил он асинхронное действие или нет?

если ваш бэк не знает, то другой сервис, который использует бэк, тем более не сможет это узнать!

а если бэк знает, то просто при пинге отвечаете 400 "предыдущая операция не завершена" и 200 "взялся за работу" соответственно
Ответ написан
lazalu68
@lazalu68
Salmon
Из текста вопроса понятно, что ТС пытается решить проблему уже не раз решенную в рамках Heroku (тк сервису уже достаточно много годиков), по этому поводу решил проверить сам как оно всё работает: создал учетку на хероку, создал задачку для Heroku Scheduler которая тянет из интернетов список персонажей из рика и морти, поднял приложение которое отдаёт случайного персонажа из скачанного списка,

Из всего этого следует, что нативные для Heroku инструменты прекрасно справляются с поставленной задачей. Если хочется обязательно иметь интервал 5 минут, то благо Heroku Scheduler не единственный, можно использовать например Advanced Scheduler или вообще Custom clock process. Clock process это очень мощная штука, с ней вы можете что угодно реализовать
Ответ написан
mitgolm
@mitgolm
Software Engineer
Попробуйте использовать в качестве планировщика задач node-schedule. Написал пример, как можно решить вашу задачу

const schedule = require('node-schedule');
const lowdb = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

// Local database for saving jobs state
const db = lowdb(new FileSync('./jobs.json'));
db.defaults({ jobs: [] }).write();

const jobManager = {
  // Retrieving jobs from database and check if has active job
  hasActive: () => db.get('jobs').find((job) => job.isActive).value(),
  // Add active job
  add: () => {
    const [lastJob] = db.get('jobs').takeRight(1).value();
    db.get('jobs').push({ id: lastJob ? lastJob.id + 1 : 0, isActive: true }).write();
  },
  // Finish active job
  finish: () => {
    const [lastJob] = db.get('jobs').takeRight(1).value();
    db.get('jobs').find({ id: lastJob.id }).assign({ isActive: false }).write();
  }
};

// Your heavy async job
const job = async () => {
  if (!jobManager.hasActive()) {
    jobManager.add()
    console.log('Heavy job ...');
    jobManager.finish()
  } else {
    return 'Skipped, because you have active job now. Expect for current job finish';
  }
};

// Recurrence job at every 5 minutes
schedule.scheduleJob('*/5 * * * *', async () => {
  job().then((response) => console.log(response));
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы