在Azure中编写(+锁定)/读取文件的Python脚本

时间:2019-05-18 19:09:13

标签: python python-3.x azure azure-storage-account

我是python编程和Azure的新手。

我需要编写一个脚本,该脚本将由2个进程执行。

这两个进程将运行相同的python脚本。 我知道Azure有storageAccounts可以在其中放入一些文件,我发现了这一点: 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中实现呢?谢谢。

编辑 我设法用python脚本在Blob存储中写了一个文件。现在的问题是:如何在第一个进程写入命令结果的同时锁定文件,并在由Blob存储锁(如果存在该选项...)释放后立即让第二个进程读取文件第一个过程?这是iam使用的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 个答案:

答案 0 :(得分:1)

  

如何在将命令结果写入文件时锁定文件   第一个过程,并在第二个过程中尽快将其读取   Blob存储锁(如果存在该选项...)由第一个释放   过程吗?

Azure Blob存储具有一个称为Lease的功能,您可以使用它。本质上,Leasing进程在资源上获得排他锁(在您的情况下为blob),并且只有一个进程可以在blob上获得租约。一旦在Blob上获得租约,其他任何过程都无法修改或删除Blob。

因此,您需要做的是尝试在写入之前在blob上获取租约。如果Blob已被租借,则会返回一个错误(HTTP状态码412,PreConditionFailed错误)。假设您没有收到错误,则可以继续更新文件。文件更新后,您可以手动释放锁定(中断租约或释放租约),也可以让租约自动过期。假设您遇到错误,则应等待并定期(例如每5秒一次)获取Blob的租约状态。一旦发现该Blob已不再租借,就可以阅读该Blob的内容。