Ограничение выполнение заданий по количеству потоков

artymagik

Новичок
Регистрация
06.07.2016
Сообщения
10
Благодарностей
0
Баллы
3
Всем привет! Подскажите, как разрулить такую ситуацию

Дано:
Работаю через свою админ-панельку.
В базе есть таблица с задачами.
1 строка = одна постоянная задача, с ограничителем.

Например, есть две строки - это две задачи
Задача 1 - 0/100
Задача 2 - 0/40
Последнее число означает максимум количество потоков на задачу.

Шаблон работает через диспетчер заданий и выполняется каждые 1-2 минуты.
Я пошел простым путем и создал две переменные THREADS (что означает максимум потоков) и THREADS_NOW (количество работающих потоков сейчас)
Логика такая, что при достижение 100 потоков (или заданного максимума) - задание больше новым запущенным потокам не выдается.
SQL:
SELECT * FROM table WHERE threads_now < threads order by rand() LIMIT 1
Поскольку шаблон многопоточный и идет куча запросов на апдейт строки, нужно было правильно организовать запись.
В шаблоне при получении таски выполняю GET запрос, который дергает хранимую базу в БД и выполняет +1 для THREADS_NOW, при завершении таски и BAD_END запрос на -1 для THREADS_NOW.

Процедура выглядит так.
Процедура:
BEGIN
    START TRANSACTION;
    SELECT id, threads_now FROM table WHERE id = p_id FOR UPDATE;
   UPDATE table
        SET threads_now = threads_now + 1
        WHERE id = p_id;
   COMMIT;
END
Всё бы ничего, и отрабатывает окей. Но каждый день сталкиваюсь с тем, что цифры в итоге перестают совпадать и превышают реальное количество работающих потоков. Большое подозрение, что некорректно отрабатывает BAD_END

Кто сталкивался, или кто знает, как по другому разрулить такую ситуацию - прошу проконсультировать.

Заранее спасибо за внимание и помощь!
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Откажись от счетчика в бд. Считай посредством количества записей. На каждую запись вешай дату актуальности. Если где-то запись не обновится по завершению - всё равно со временем выдохнется
 

artymagik

Новичок
Регистрация
06.07.2016
Сообщения
10
Благодарностей
0
Баллы
3
т.е ты предлагаешь, мне в отдельную таблицу генерировать для задачи много строк, и их разбирать потоками и соответственно удалять?
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
т.е ты предлагаешь, мне в отдельную таблицу генерировать для задачи много строк, и их разбирать потоками и соответственно удалять?
ну типа того. селектишь строки по нужной задаче с актуальной датой - получаешь число активных потоков. Поток отработан - строка удаляется или статус какой-то меняется, или актуальная дата (что больше нравится). Если по какой-то причине не удалилась - повисит какое-то время, пока дата не перестанет быть актуальной и селект перестанет брать её в расчёт
 
  • Спасибо
Реакции: artymagik

artymagik

Новичок
Регистрация
06.07.2016
Сообщения
10
Благодарностей
0
Баллы
3
да, не успел прочитать так и сделал. сделал отдельную таблицу и делают туда запись о таске и удаляю её по завершению или по истечению времени.
Сделал так же: через хранимую процедуру с транзакцией - работает пока 4-5 часов, полет нормальный.
Благодарю!
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)