Сценарий Python для записи (+ блокировки) / чтения файла в Azure - PullRequest
0 голосов
/ 18 мая 2019

Я новичок в программировании на Python и Azure.

Мне нужно написать скрипт, который будет выполняться 2 процессами.

2 процесса будут запускать один и тот же скрипт на Python. Я знаю, что в Azure есть учетные записи для хранения некоторых файлов, я нашел это: https://docs.microsoft.com/en-us/python/api/azure-storage-file/azure.storage.file.fileservice.fileservice?view=azure-python

и: https://github.com/Azure/azure-storage-python

Вот некоторый псевдокод для иллюстрации того, что мне нужно достичь:

function useStorageFile
   if(fileFromStorage == null)
      createFileInStorage lockFileInStorage;
      executeDockerCommand;
      writeResultOFCommandInStorageFile;
   else
      if(fileFromStorage != null)
        X:if(fileFromStorage.status !== 'locked')
           readResultFromFile
        else
           wait 1s;
           continue X;

Можно ли заблокировать / разблокировать файл в Azure? Как я могу достичь этого в Python, например? спасибо.

EDIT Мне удалось написать файл в хранилище BLOB-объектов с помощью сценария Python. Теперь возникает вопрос: как я могу заблокировать файл во время записи результата команды в нем первым процессом и заставить его прочитать второй процесс, как только блокировка хранилища BLOB-объектов (если опция существует ...) будет снята первый процесс? Вот скрипт Python, который я использую:

import os, uuid, sys
from azure.storage.blob import BlockBlobService, PublicAccess

def run_sample():
    try:
        # Create the BlockBlockService that is used to call the Blob service for the storage account
        block_blob_service = BlockBlobService(account_name='xxxxxx', account_key='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')

        # Create a container called 'quickstartblobs'.
        container_name ='quickstartblobs'
        block_blob_service.create_container(container_name)

        # Set the permission so the blobs are public.
        block_blob_service.set_container_acl(container_name, public_access=PublicAccess.Container)

        # Create a file in Documents to test the upload and download.
        local_path=os.path.abspath(os.path.curdir)
        local_file_name ='youss.txt'
        full_path_to_file =os.path.join(local_path, local_file_name)

        # Write text to the file.
        file = open(full_path_to_file,  'w')
        file.write("Hello, World!")
        file.close()

        print("Temp file = " + full_path_to_file)
        print("\nUploading to Blob storage as blob" + local_file_name)

        # Upload the created file, use local_file_name for the blob name
        block_blob_service.create_blob_from_path(container_name, local_file_name, full_path_to_file)

        # List the blobs in the container
        print("\nList blobs in the container")
        generator = block_blob_service.list_blobs(container_name)
        for blob in generator:
            print("\t Blob name: " + blob.name)

        # Download the blob(s).
        # Add '_DOWNLOADED' as prefix to '.txt' so you can see both files in Documents.
        full_path_to_file2 = os.path.join(local_path, str.replace(local_file_name ,'.txt', '_DOWNLOADED.txt'))
        print("\nDownloading blob to " + full_path_to_file2)
        block_blob_service.get_blob_to_path(container_name, local_file_name, full_path_to_file2)

        sys.stdout.write("Sample finished running. When you hit <any key>, the sample will be deleted and the sample "
                         "application will exit.")
        sys.stdout.flush()
        input()

        # Clean up resources. This includes the container and the temp files
        block_blob_service.delete_container(container_name)
        os.remove(full_path_to_file)
        os.remove(full_path_to_file2)
    except Exception as e:
        print(e)


# Main method.
if __name__ == '__main__':
    run_sample()

1 Ответ

1 голос
/ 21 мая 2019

Как я могу заблокировать файл во время записи результата команды на него первый процесс, и сделать его читать вторым процессом, как только Блокировка хранилища BLOB-объектов (если опция существует ...) снимается первой процесс?

В хранилище BLOB-объектов Azure есть функция Lease, которую вы можете использовать. По сути, Leasing процесс получает эксклюзивную блокировку ресурса (в вашем случае BLOB-объект), и только один процесс может получить в аренду этот объект. После получения аренды для большого двоичного объекта любой другой процесс не может изменить или удалить большой двоичный объект.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...