- Регистрация
- 06.07.2016
- Сообщения
- 10
- Благодарностей
- 0
- Баллы
- 3
Всем привет! Подскажите, как разрулить такую ситуацию
Дано:
Работаю через свою админ-панельку.
В базе есть таблица с задачами.
1 строка = одна постоянная задача, с ограничителем.
Например, есть две строки - это две задачи
Задача 1 - 0/100
Задача 2 - 0/40
Последнее число означает максимум количество потоков на задачу.
Шаблон работает через диспетчер заданий и выполняется каждые 1-2 минуты.
Я пошел простым путем и создал две переменные THREADS (что означает максимум потоков) и THREADS_NOW (количество работающих потоков сейчас)
Логика такая, что при достижение 100 потоков (или заданного максимума) - задание больше новым запущенным потокам не выдается.
Поскольку шаблон многопоточный и идет куча запросов на апдейт строки, нужно было правильно организовать запись.
В шаблоне при получении таски выполняю GET запрос, который дергает хранимую базу в БД и выполняет +1 для THREADS_NOW, при завершении таски и BAD_END запрос на -1 для THREADS_NOW.
Процедура выглядит так.
Всё бы ничего, и отрабатывает окей. Но каждый день сталкиваюсь с тем, что цифры в итоге перестают совпадать и превышают реальное количество работающих потоков. Большое подозрение, что некорректно отрабатывает BAD_END
Кто сталкивался, или кто знает, как по другому разрулить такую ситуацию - прошу проконсультировать.
Заранее спасибо за внимание и помощь!
Дано:
Работаю через свою админ-панельку.
В базе есть таблица с задачами.
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
Кто сталкивался, или кто знает, как по другому разрулить такую ситуацию - прошу проконсультировать.
Заранее спасибо за внимание и помощь!
Последнее редактирование: