|
Имитация потоков, распределение задач
|
|||
---|---|---|---|
#18+
Добрый день.. Есть необходимость делать много долгих запросов, поэтому написал цикл длинной в 60 сек, выглядит примерно так: Код: php 1. 2. 3. 4.
Который раз в секунду делает запрос к БД и пытается получить задание Код: sql 1.
Как только получает, сразу же делает update Код: sql 1.
и после выполнения завершает цикл. (выполнение от 50 до 300 сек) Стоит 10 крон задач вызовом php -f, которые каждую минуту запускает 10 копий этого скрипта с указанием параметра, какой № этого потока. Так вот, получается ожидая задачу крутит 10 таких циклов, и между SELECT и UPDATE два разных потока умудряются схватить 1 и ту-же задачу. Пока решил это так: задача сразу назначается конкретному потоку (сначала свободным, потом менее занятым), но не во всех задачах это можно реализовать. Как можно решить это на уровне SQL ? InnoDB Читал про блокировки, но везде пишут, что в нагруженных проектах блокировки зло, надо без них... У меня не нагруженный проект совсем, по меркам тех же ОД,ВК и т.д. как решается это там? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2019, 07:48 |
|
Имитация потоков, распределение задач
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2019, 09:01 |
|
Имитация потоков, распределение задач
|
|||
---|---|---|---|
#18+
авторКак можно решить это на уровне SQL ? InnoDB как вариант в записи есть поле, которое инкриментится при каждом изменении, например, revision тогда раз в секунду запрос к БД Код: plsql 1.
если что-то есть - попытка захватить запись Код: plsql 1.
где {revision} - значение полученное из селекта на пред шаге если кол-во измененных записей = 1 - запись ваша, если нет, повторяем с начала авторт.д. как решается это там? есть вариант использовать очереди сообщений ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2019, 18:53 |
|
Имитация потоков, распределение задач
|
|||
---|---|---|---|
#18+
авторкак вариант в записи есть поле, которое инкриментится при каждом изменении, например, revision тогда раз в секунду запрос к БД где {revision} - значение полученное из селекта на пред шаге если кол-во измененных записей = 1 - запись ваша, если нет, повторяем с начала Интересно... в принципе я могу просто дописать where status='wait' т.к. если другой поток ее уже схватил, то кто-то из них все равно первым внесет изменения, не может быть 2 update одновременно.. автор https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html С этим пока тоже разбираюсь.. Но почему-то мускуль ругается на LOCK или FOR UPDATE/SHARE Думаю после праздников создать тестовую базу и там баловаться.. авторесть вариант использовать очереди сообщений С этим тоже обязательно ознакомлюсь. Всем большое спасибо, есть куда двигаться дальше) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2019, 18:32 |
|
|
start [/forum/topic.php?fid=23&fpage=16&tid=1459980]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 261ms |
total: | 377ms |
0 / 0 |