Получи случайную криптовалюту за регистрацию!

Если вы писали когда-либо мультипоточные или мультипроцессорны | Python Заметки

Если вы писали когда-либо мультипоточные или мультипроцессорные приложения то вы знаете какая самая большая проблема у таких программ.
Это конечно же синхронизация (мы сейчас не про GIL).

Что такое синхронизация? Это когда параллельно работающий код может делать расчёты абсолютно независимо, но вот к общим данным они должны обращаться последовательно в определённом порядке. То есть нужна синхронность вместо асинхронности.
Пока один процесс открыл файл, другие просто ждут своей очереди. Пока один поток обновляет переменную, другие просто спят, опять же ждут своей очереди.

В Python есть стандартные средства для синхронизации. Это так называемые мьютексы с различной логикой. Например Lock, Semaphore или очередь Queue. Все они работают в контексте одного интерпретатора. То есть все потоки или процессы должны быть запущены из одной программы. Тогда можно использовать один Lock между потоками и общую память между процессами.

Но что же делать, если процессы независимы? То есть я просто запускаю два разных интерпретатора с разным кодом. Возможно даже разных версий Python. В моём случае мне потребовалось писать некоторый кеш из одного модуля, который работает совершенно в разных приложениях как вспомогательный инструмент.

Сначала я пытался что-то сделать на основе shelve, но потом нашел отличную библиотеку diskcache.

Этот проект покрыл все мои потребности:

thread-safe и process-safe
То есть можно выполнять команды из разных процессов и потоков и они всегда будут синхронизированы.
Можно писать из разных процессов не опасаясь получить ошибку о том что файл занят другим процессом (как это бывает с shelve)
всегда атомарные операции
Это значит что любое действие выполняется в один запрос.
безсерверный
Не требуется отдельный процесс для синхронизации. Всё решается через базу данных.

Полный список возможностей

Из удобных фичей можно еще отметить встроенный Lock, позволяющий синхронизировать независимые процессы. Это как раз то что я искал!

На что стоит обратить внимание:
несовместимы версии python 2 и 3 из-за разницы протоколов pickle
надёжность работы с сетевыми дисками под вопросом, я бы не стал. Но тут скорей вопрос к сети чем к софту.
при создании инстанса diskcache.Cache() все данные пишутся в рандомную директорию в temp. Чтобы синхронизировать разные процессы следует указывать одинаковый путь diskcache.Cache(some_path).

#libs