Как реализовать параллельную обработку записей таблицы?
Есть таблица с огромным количеством данных.
Есть скрипт который берет устаревшую запись (в таблице есть поле с отметкой последней обработки), обрабатывает ее и вносит результат обработки в таблицу.
Данных очень много в таблице, для ускорения обработки хочется запустить несколько экземпляров скрипта.
Но появляется проблема - экземпляры скрипта могут запросто схватить 1 и ту е запись из таблицы и начать ее обрабатывать одновременно.
Как реализовать параллельную обработку данных таблицы и избежать такого рода проблем?
Пока из идей только разве что добавить булево поле "in processing" и менять его когда какой-то из экземпляров скрипта хватает запись в обработку, после обработки менять данное поле обратно. Но тут возможна ситуация когда экземпляр скрипта по какой-то причине умрет и "in processing" останется в состоянии обработки навсегда.
ScriptKiddo, угу, то есть это блокирует запись таблицы на редактирование, но с помощью SELECT который будет выполняться скажем в 100 потоков 1 и ту же запись получить можно будет все равно, верно?
sbh, конечно. Вам потребуется доп параметр, который позволит определить, обрабатывалась уже запись или нет.
В принципе, можете сделать так: один экземпляр скрипта выбирает последовательно пачку данных. К примеру, 1000 строк. После чего их обрабатываете через multiprocessing.map() в нужное количество процессов. Так, каждому процессу достанется своя порция непересекающихся данных для обработки.