Python: О чем беспокоиться, когда множественные процессы одновременно записывают на "полку"?

Для моего приложения на python я думаю об использовании shelve, части стандартной библиотеки. Там будут сотни процессов, каждый из которых записывает что-то в один и тот же объект полки. Смысл всегда будет в том, чтобы добавить новый ключ, пару значений на полку. Ключи уникальны, поэтому никакие два процесса не будут обновлять одну и ту же запись.

Что может пойти не так в таком сценарии?

2 ответа

Документация полки явно об этом.

Модуль полки не поддерживает одновременный доступ для чтения / записи к отложенным объектам. (Несколько одновременных обращений к чтению безопасны.) Если в программе открыта полка для записи, никакая другая программа не должна открывать ее для чтения или записи. Для решения этой проблемы можно использовать блокировку файлов Unix, но она отличается в разных версиях Unix и требует знания используемой реализации базы данных.

Так что без синхронизации процесса я бы этого не сделал.

Как начинаются процессы? Если они созданы главным процессом, вы можете посмотреть на многопроцессорный модуль. Используйте очередь, в которую дочерние процессы записывают свои результаты, и попросите мастера удалить элементы из очереди и записать их на полку. Пример такого рода на /questions/29756189/parallelnaya-obrabotka-mnogopotochnost-v-python/29756204#29756204.

Если у вас нет иерархии процессов, вам нужно будет использовать блокировку для контроля доступа на чтение и запись к полочному файлу. Если вы используете Linux или подобное, вы можете использовать posix_ipc с именем семафор.

Другой очевидный вариант - использовать сервер базы данных - Postgresql или аналогичный.

В вашем случае вам, вероятно, повезет больше, если использовать более надежный магазин kvp, например, redis. Довольно просто настроить локальную службу Redis или удаленную службу Redis (например, в службе AWS ElastiCache).

Другие вопросы по тегам