Поделиться через


Создание аренды контейнеров и управление ими с помощью Python

В этой статье показано, как создавать аренды контейнеров и управлять ими с помощью клиентской библиотеки служба хранилища Azure для Python. Клиентская библиотека может использовать для получения, продления, освобождения и прерывания аренды контейнеров.

Сведения о аренде контейнера BLOB-объектов с помощью асинхронных API см. в статье "Асинхронное использование контейнеров аренды".

Необходимые компоненты

  • В этой статье предполагается, что у вас уже есть проект, настроенный для работы с клиентской библиотекой Хранилище BLOB-объектов Azure для Python. Сведения о настройке проекта, включая установку пакета, добавление import инструкций и создание авторизованного клиентского объекта, см. в статье "Начало работы с Хранилище BLOB-объектов Azure и Python".
  • Механизм авторизации должен иметь разрешения на работу с арендой контейнера. Дополнительные сведения см. в руководстве по авторизации для следующей операции REST API:

Сведения об аренде контейнеров

Аренда устанавливает блокировку контейнера для операций удаления и управляет ими. Длительность блокировки может составлять 15–60 секунд либо быть бесконечной. Аренда контейнера предоставляет эксклюзивный доступ к удалению контейнера. Аренда контейнера управляет только возможностью удаления контейнера с помощью операции REST API удаления контейнера . Для удаления контейнера с активной арендой клиент наряду с запросом на удаление должен ввести активный идентификатор аренды. Все остальные операции контейнера успешно выполняются в арендованном контейнере без идентификатора аренды. Если вы включили обратимое удаление контейнера, можно восстановить удаленные контейнеры.

Дополнительные сведения о состояниях аренды и о том, когда можно выполнить данное действие по аренде, см. в разделе "Состояния аренды" и действия.

Операции аренды обрабатываются классом BlobLeaseClient , который предоставляет клиенту все операции аренды для больших двоичных объектов и контейнеров. Дополнительные сведения об аренде BLOB-объектов с помощью клиентской библиотеки см. в статье "Создание аренды BLOB-объектов и управление ими с помощью Python".

Получение аренды

При получении аренды контейнера вы получите идентификатор аренды, который код может использовать для работы с контейнером. Если контейнер уже имеет активную аренду, можно запросить только новую аренду с помощью активного идентификатора аренды. Однако можно указать новую длительность аренды.

Чтобы получить аренду, создайте экземпляр класса BlobLeaseClient , а затем используйте следующий метод:

Вы также можете получить аренду с помощью следующего метода из класса ContainerClient :

Следующий пример получает 30-секундную аренду контейнера:

def acquire_container_lease(self, blob_service_client: BlobServiceClient, container_name):
    # Instantiate a ContainerClient
    container_client = blob_service_client.get_container_client(container=container_name)

    # Acquire a 30-second lease on the container
    lease_client = container_client.acquire_lease(30)

    return lease_client

Продление аренды

Вы можете продлить аренду контейнера, если идентификатор аренды, указанный в запросе, соответствует идентификатору аренды, связанному с контейнером. Аренда может быть продлена даже в том случае, если срок его действия истек, если контейнер еще не был арендован с момента истечения срока действия этой аренды. При продлении аренды длительность сброса аренды.

Чтобы продлить аренду, используйте следующий метод:

В следующем примере возобновляется аренда контейнера:

def renew_container_lease(self, lease_client: BlobLeaseClient):
    # Renew a lease on the container
    lease_client.renew()

Освобождение аренды

Вы можете освободить аренду контейнера, если идентификатор аренды, указанный в запросе, соответствует идентификатору аренды, связанному с контейнером. Освобождение аренды позволяет другому клиенту получить аренду контейнера сразу после завершения выпуска.

Вы можете освободить аренду с помощью следующего метода:

В следующем примере освобождается аренда контейнера:

def release_container_lease(self, lease_client: BlobLeaseClient):
    # Release a lease on the container
    lease_client.release()

Прерывание аренды

Вы можете разорвать аренду контейнера, если контейнер имеет активную аренду. Любой авторизованный запрос может нарушить аренду; Запрос не требуется для указания соответствующего идентификатора аренды. Аренда не может быть продлена после того, как она нарушена, и разрыв аренды предотвращает получение новой аренды в течение определенного периода времени, пока исходная аренда не истекает или не будет освобождена.

Вы можете разорвать аренду с помощью следующего метода:

В следующем примере прерывается аренда контейнера:

def break_container_lease(self, lease_client: BlobLeaseClient):
    # Break a lease on the container
    lease_client.break_lease()

Контейнеры аренды асинхронно

Клиентская библиотека Хранилище BLOB-объектов Azure для Python асинхронно поддерживает контейнеры аренды. Дополнительные сведения о требованиях к настройке проекта см. в статье асинхронное программирование.

Выполните следующие действия, чтобы арендовать контейнер с помощью асинхронных API:

  1. Добавьте в файл следующие операторы импорта:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClient
    
  2. Добавьте код для запуска программы с помощью asyncio.run. Эта функция запускает переданную корутину в main() нашем примере и управляет циклом asyncio событий. Корутины объявляются с синтаксисом async/await. В этом примере main() корутин сначала создает верхний уровень BlobServiceClient с помощью async with, а затем вызывает метод, который получает аренду контейнера. Обратите внимание, что использовать только клиент верхнего уровня, так как другие клиенты, созданные из него, используют async withтот же пул подключений.

    async def main():
        sample = ContainerSamples()
    
        # TODO: Replace <storage-account-name> with your actual storage account name
        account_url = "https://<storage-account-name>.blob.core.windows.net"
        credential = DefaultAzureCredential()
    
        async with BlobServiceClient(account_url, credential=credential) as blob_service_client:
            lease_client = await sample.acquire_container_lease(blob_service_client, "sample-container")
    
    if __name__ == '__main__':
        asyncio.run(main())
    
  3. Добавьте код для получения аренды контейнера. Код совпадает с синхронным примером, за исключением того, что метод объявляется с async ключевое слово, а await при вызове acquire метода используется ключевое слово.

    async def acquire_container_lease(self, blob_service_client: BlobServiceClient, container_name):
        # Instantiate a ContainerClient
        container_client = blob_service_client.get_container_client(container=container_name)
    
        # Acquire a 30-second lease on the container
        lease_client = BlobLeaseClient(container_client)
        await lease_client.acquire(lease_duration=30)
    
        return lease_client
    

С помощью этой базовой настройки вы можете реализовать другие примеры в этой статье в качестве корутин с помощью синтаксиса async/await.

Состояния аренды и действия

На следующей схеме показаны пять состояний аренды, а также команды или события, вызывающие изменение состояния аренды.

A diagram showing container lease states and state change triggers.

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

Состояние аренды Description Разрешенные действия аренды
Доступно Аренда разблокирована и может быть приобретена. acquire
Аренду Аренда заблокирована. acquire (один и тот же идентификатор аренды), renew, change, releaseи break
Срок действия истек Срок аренды истек. acquire, renew, release и break
Нарушение Аренда была нарушена, но аренда будет по-прежнему заблокирована до истечения периода перерыва. release и break.
Неисправно Аренда была нарушена, и срок перерыва истек. acquire, release и break

По истечении срока аренды идентификатор аренды сохраняется службой BLOB-объектов до тех пор, пока контейнер не будет изменен или арендован снова. Клиент может попытаться продлить или освободить аренду с помощью идентификатора аренды с истекшим сроком действия. Если запрос завершается ошибкой, клиент знает, что контейнер был арендован снова или контейнер был удален с момента последнего активного аренды.

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

Ресурсы

Дополнительные сведения о аренде контейнера с помощью клиентской библиотеки Хранилище BLOB-объектов Azure для Python см. в следующих ресурсах.

Операции REST API

Пакет SDK Azure для Python содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API с помощью знакомых парадигм Python. Методы клиентской библиотеки для аренды контейнера используют следующую операцию REST API:

Примеры кода

Ресурсы клиентской библиотеки

См. также