У меня есть фрагмент кода, который часто запускается несколькими процессами, в котором определенный blob-файл должен быть обновлен какой-то новой информацией. Поскольку я не хочу, чтобы эти процессы одновременно выполняли запись в этот файл - что могло бы вызвать конфликтные ошибки - я назначил аренду файла, когда процесс начинает его изменять, и хочу разорвать эту аренду, как только он завершит ее изменение.
Теперь проблема в том, что мне нужно проверять для каждого процесса, есть ли уже аренда блоб-файла, и если нет, продолжать ждать, пока аренда не будет нарушена, а затем получить аренду для текущего процесса. Теперь я понимаю, как это можно сделать, запустив следующий код:
stream = io.BytesIO()
if self.blob_service.exists(self.container, self.changelog):
while True:
try:
self.blob_service.acquire_blob_lease(self.container, self.changelog,
lease_duration=-1)
break
except AzureConflictHttpError:
pass
self.blob_service.get_blob_to_stream(self.container, self.changelog, stream)
stream.seek(0)
.... do some processing and write to blobfile
self.blob_service.break_blob_lease(self.container, self.changelog)
blob_service
- это экземпляр BlockBlobService
. Однако это приводит к непрерывному потоку регистрации 2020-04-19 16:19:51,517 ERROR Client-Request-ID=d53b7e6e-8248-11ea-a073-dca90492a6b8 Retry policy did not allow for a retry: Server-Timestamp=Sun, 19 Apr 2020 14:19:50 GMT, Server-Request-ID=c339439f-e01e-0058-1d55-16e3bc000000, HTTP status code=409, Exception=There is already a lease present. ErrorCode: LeaseAlreadyPresent<?xml version="1.0" encoding="utf-8"?>LeaseAlreadyPresent
Уже есть арендный договор. RequestId: c339439f-e01e-0058-1d55-16e3bc000000Время: 2020-04-19T14: 19: 51.5047575Z .
Это будет go включаться до тех пор, пока процесс 1 не прервет аренду и процесс 2 не сможет получить аренду.
Теперь, конечно, есть способы подавить это ведение журнала, но я бы предпочел сделать что-то подобное.
while True:
if self.blob_service.blob_has_lease(self.container, self.changelog):
continue
else:
self.blob_service.acquire_blob_lease(self.container, self.changelog,
lease_duration=-1)
В if self.blob_service.blob_has_lease(self.container, self.changelog)
я что-то придумал себя. Однако я никоим образом не могу найти такой метод или свойство для проверки, есть ли у определенного BLOB-объекта аренда на данный момент. Есть ли такой метод или обходной путь, в котором я мог бы написать свой код, как в примере, который я привел выше?