是否可以使用Python SDK检查特定Azure blob上是否存在租约?

2024-06-16 13:34:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码,通常由多个进程运行,其中某个blobfile必须用一些新信息更新。由于我不希望这些进程同时写入此文件(这将导致冲突错误),因此在进程开始修改文件时,我对该文件进行了租约,并希望在完成修改后中断此租约

现在的问题是,我必须检查每个进程是否已经有blobfile上的租约,如果没有,继续等待,直到租约被打破,然后为当前进程获取租约。我现在意识到这一点的方式是运行以下代码:

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"?><Error><Code>LeaseAlreadyPresent</Code><Message>There is already a lease present.RequestId:c339439f-e01e-0058-1d55-16e3bc000000Time:2020-04-19T14:19:51.5047575Z</Message></Error>.记录流 这将一直持续到进程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)

在{}中,是我自己编的东西。然而,我无论如何也找不到这样的方法或属性来检查某个blob当前是否有租约。是否有任何这样的方法或变通方法可以让我像上面提供的示例那样编写代码


Tags: 文件代码selftruestreamif进程container
1条回答
网友
1楼 · 发布于 2024-06-16 13:34:04

您可以调用^{}方法来获取blob的属性。如果一个blob被租用,那么您应该在^{}下的^{}变量中获得一些值

相关问题 更多 >