172 похожих чатов

Привет ребят, подскажите, в правильном ли направлении мыслю? Есть у меня

база с таблицей items в 300к строк, мне нужно в несколько потоков (worker pool) ходить в базу, брать, скажем, 100 строк, делать над ними работу (ходить к стороннему API, среднее время ответа 700мс) и класть обновленные данные в другую таблицу results. Меня в этом алгоритме беспокоит, что два воркера могут одновременно работать с одним массивом строк. Правильно ли использовать LIMIT и OFFSET для обеспечения уникального массива строк, контролируя это поведение на уровне приложения? Или есть в postgres более эффективные механизмы?

11 ответов

5 просмотров

Я бы брал по остатку от деления первичного ключа. select * from items where id % (кол-во воркеров) = (номер воркера)

Andrei Ilinskii
Я бы брал по остатку от деления первичного ключа. ...

главное чтобы при этом использовался индекс

Denis-Nesterenko Автор вопроса
Alexey Bulgakov
главное чтобы при этом использовался индекс

Как-то раз я штук двадцать индексов по id%N сделал. Или даже тридцать :)

Я бы, вероятно, как-то боокировал эти строки в постгрессе на время обработки. Ну там, непосредственно в них записывал host.pid воркера или не в них, а рядом... С обеспечением атомарности записи.

Denis-Nesterenko Автор вопроса
Ilya Anfimov
Я бы, вероятно, как-то боокировал эти строки в пос...

Если я правильно понял, на чтение блокировки нет в постгресе?!

Denis Nesterenko
Если я правильно понял, на чтение блокировки нет в...

Никто не заставляет вас блокировать именно "на чтение".

Denis Nesterenko
Если я правильно понял, на чтение блокировки нет в...

Вообще, лично я бы делал select for update skip locked where id not in (select from worker_lock) , и потом писал в worker_lock.

Denis Nesterenko
Если я правильно понял, на чтение блокировки нет в...

А worker_lock так или иначе чистил периодически от зависшэго.

Denis Nesterenko
Выглядит сложновато

Тема параллелизма, атомарности и блокировок никогда не была простой. И да, это ещё всё достаточно примитивно.

Похожие вопросы

Обсуждают сегодня

кому не сложно распишите пожалуйста для какой цели тут вот эти скобки и в них пихается указатель?
Михаил Helper
15
Комрады, посоветуйте, куда копать? Стал прикручивать кастомизацию тем. В OnShow главной главной формы пытаюсь загрузить из файла настроек и применить тему (на скрине, как долж...
Ed Doc
13
Такс, блин, таки кто-то знает, каким образом работают макросы stdin/stdout/stderr? Я влез в stdio.h, там определения нет, отладил через асмокод - вызывается функция со странны...
The Bird of Hermes
18
OnShow один раз вызывается? или возможен Hide?
Iluha Companets
14
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
зачем же переименовывать ? чтобы кол-во участников возросло или вдруг IBM от этого снова на свифте начнет кодить ? Я не понимаю что страшного в том что свифт гавно, если это т...
Oleh Nerzh
10
Карта сайта