全部產品
Search
文件中心

Object Storage Service:非同步處理(Python SDK V2)

更新時間:Aug 01, 2025

非同步處理(x-oss-async-process)是指程式執行一個任務時,不需要等待該任務完成就能繼續執行其他任務。本文介紹如何使用Python SDK V2進行非同步處理的情境,例如文檔轉換、視頻轉碼、視頻拼接等。

注意事項

  • 本文範例程式碼以華東1(杭州)的地區IDcn-hangzhou為例,預設使用外網Endpoint,如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS地區和訪問網域名稱

方法定義

async_process_object(request: AsyncProcessObjectRequest, **kwargs) → AsyncProcessObjectResult

請求參數列表

參數名

類型

說明

request

AsyncProcessObjectRequest

佈建要求參數,具體請參見AsyncProcessObjectRequest

傳回值列表

類型

說明

AsyncProcessObjectResult

傳回值,具體請參見AsyncProcessObjectResult

關於非同步處理方法的完整定義,請參見async_process_object

範例程式碼

以下代碼展示了如何使用Python SDK V2進行文檔格式轉換,將其轉換為需要的輸出類型。

import base64
import argparse
import alibabacloud_oss_v2 as oss

# 建立命令列參數解析器,並描述指令碼用途:非同步處理對象(如影像處理)
parser = argparse.ArgumentParser(description="async process object sample")

# 定義命令列參數,包括必需的地區、儲存空間名稱、endpoint、對象鍵名以及目標儲存空間和映像名稱
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the object.', required=True)
parser.add_argument('--target_key', help='Specify the name of the processed object.', required=True)
parser.add_argument('--target_bucket', help='Specify the name of the bucket used to store processed object.', required=True)

def main():
    # 解析命令列參數,擷取使用者輸入的值
    args = parser.parse_args()

    # 從環境變數中載入訪問憑證資訊,用於身分識別驗證
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK預設配置建立設定物件,並設定認證提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # 設定設定物件的地區屬性,根據使用者提供的命令列參數
    cfg.region = args.region

    # 如果提供了自訂endpoint,則更新設定物件中的endpoint屬性
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 使用上述配置初始化OSS用戶端,準備與OSS互動
    client = oss.Client(cfg)

    # 定義將源Docx文檔轉換為PNG圖片的處理規則
    style = "doc/convert,target_png,source_docx"

    # 對目標儲存空間名和檔案名稱進行Base64編碼,以確保它們可以在URL中安全傳輸
    target_bucket_base64 = base64.b64encode(args.target_bucket.encode()).decode()
    target_key_base64 = base64.b64encode(args.target_key.encode()).decode()

    # 構建處理指示,包含樣式和儲存位置
    process = f"{style}|sys/saveas,o_{target_key_base64},b_{target_bucket_base64}"

    # 發送非同步請求以處理指定對象並按照給定的樣式儲存到目標儲存空間
    result = client.async_process_object(oss.AsyncProcessObjectRequest(
        bucket=args.bucket,  # 儲存空間名
        key=args.key,  # 對象鍵名
        process=process,  # 處理指示
    ))

    # 列印操作結果的狀態代碼和其他相關資訊,以便確認請求狀態和處理結果
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' event id: {result.event_id},'
          f' task id: {result.task_id},'
          f' process request id: {result.process_request_id},'
          )

# 當此指令碼被直接執行時,調用main函數開始處理邏輯
if __name__ == "__main__":
    main()  # 指令碼進入點,控製程序流程從這裡開始

常見使用情境

視頻轉碼

您可以使用視頻轉碼功能,修改視頻的編碼格式、降低解析度和碼率以縮小視頻檔案體積、轉換視頻封裝格式。

import base64
import argparse
import alibabacloud_oss_v2 as oss

# 建立命令列參數解析器,並描述指令碼用途:非同步處理對象
parser = argparse.ArgumentParser(description="async process object sample")

# 定義命令列參數,包括必需的地區、儲存空間名稱、endpoint、對象鍵名以及目標儲存空間和目標檔案名稱
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the object.', required=True)
parser.add_argument('--target_key', help='Specify the name of the processed object.', required=True)
parser.add_argument('--target_bucket', help='Specify the name of the bucket used to store processed object.', required=True)

def main():
    # 解析命令列參數,擷取使用者輸入的值
    args = parser.parse_args()

    # 從環境變數中載入訪問憑證資訊,用於身分識別驗證
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK預設配置建立設定物件,並設定認證提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # 設定設定物件的地區屬性,根據使用者提供的命令列參數
    cfg.region = args.region

    # 如果提供了自訂endpoint,則更新設定物件中的endpoint屬性
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 使用上述配置初始化OSS用戶端,準備與OSS互動
    client = oss.Client(cfg)

    # 定義處理風格,這裡是一個樣本視頻轉換配置,包括格式、視頻轉碼器、解析度、位元速率、幀率、音訊轉碼器、音頻位元速率等參數
    style = "video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1"

    # 對目標儲存空間名和檔案名稱進行Base64編碼,以確保它們可以在URL中安全傳輸
    target_bucket_base64 = base64.b64encode(args.target_bucket.encode()).decode()
    target_key_base64 = base64.b64encode(args.target_key.encode()).decode()

    # 構建處理指示,包含樣式和儲存位置
    process = f"{style}|sys/saveas,o_{target_key_base64},b_{target_bucket_base64}"

    # 發送非同步請求以處理指定對象並按照給定的樣式儲存到目標儲存空間
    result = client.async_process_object(oss.AsyncProcessObjectRequest(
        bucket=args.bucket,  # 儲存空間名
        key=args.key,  # 對象鍵名
        process=process,  # 處理指示
    ))

    # 列印操作結果的狀態代碼和其他相關資訊,以便確認請求狀態和處理結果
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' event id: {result.event_id},'
          f' task id: {result.task_id},'
          f' process request id: {result.process_request_id},'
          )

# 當此指令碼被直接執行時,調用main函數開始處理邏輯
if __name__ == "__main__":
    main()  # 指令碼進入點,控製程序流程從這裡開始

視頻轉動圖

您可以通過視頻轉動圖功能,將視頻轉換為GIF、WebP等格式的動圖。

import base64
import argparse
import alibabacloud_oss_v2 as oss

# 建立命令列參數解析器,並描述指令碼用途:非同步處理對象
parser = argparse.ArgumentParser(description="async process object sample")

# 定義命令列參數,包括必需的地區、儲存空間名稱、endpoint、對象鍵名以及目標儲存空間和映像名稱
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the object.', required=True)
parser.add_argument('--target_key', help='Specify the name of the processed object.', required=True)
parser.add_argument('--target_bucket', help='Specify the name of the bucket used to store processed object.', required=True)

def main():
    # 解析命令列參數,擷取使用者輸入的值
    args = parser.parse_args()

    # 從環境變數中載入訪問憑證資訊,用於身分識別驗證
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK預設配置建立設定物件,並設定認證提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # 設定設定物件的地區屬性,根據使用者提供的命令列參數
    cfg.region = args.region

    # 如果提供了自訂endpoint,則更新設定物件中的endpoint屬性
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 使用上述配置初始化OSS用戶端,準備與OSS互動
    client = oss.Client(cfg)

    # 定義視頻轉GIF動圖的參數,包括GIF寬度、高度、間隔幀數等
    style = "video/animation,f_gif,w_100,h_100,inter_1000"

    # 對目標儲存空間名和檔案名稱進行Base64編碼,以確保它們可以在URL中安全傳輸
    target_bucket_base64 = base64.b64encode(args.target_bucket.encode()).decode()
    target_key_base64 = base64.b64encode(args.target_key.encode()).decode()

    # 構建處理指示,包含樣式和儲存位置
    process = f"{style}|sys/saveas,o_{target_key_base64},b_{target_bucket_base64}"

    # 發送非同步請求以處理指定對象並按照給定的樣式儲存到目標儲存空間
    result = client.async_process_object(oss.AsyncProcessObjectRequest(
        bucket=args.bucket,  # 儲存空間名
        key=args.key,  # 對象鍵名
        process=process,  # 處理指示
    ))

    # 列印操作結果的狀態代碼和其他相關資訊,以便確認請求狀態和處理結果
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' event id: {result.event_id},'
          f' task id: {result.task_id},'
          f' process request id: {result.process_request_id},'
          )

# 當此指令碼被直接執行時,調用main函數開始處理邏輯
if __name__ == "__main__":
    main()  # 指令碼進入點,控製程序流程從這裡開始

視頻截幀

您可以通過視頻截幀功能,按一定規則提取視訊框架並轉換為需要的圖片格式。

import base64
import argparse
import alibabacloud_oss_v2 as oss

# 建立命令列參數解析器,並描述指令碼用途:非同步處理對象
parser = argparse.ArgumentParser(description="async process object sample")

# 定義命令列參數,包括必需的地區、儲存空間名稱、endpoint、對象鍵名以及目標儲存空間和映像名稱
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the object.', required=True)
parser.add_argument('--target_key', help='Specify the name of the processed object.', required=True)
parser.add_argument('--target_bucket', help='Specify the name of the bucket used to store processed object.', required=True)

def main():
    # 解析命令列參數,擷取使用者輸入的值
    args = parser.parse_args()

    # 從環境變數中載入訪問憑證資訊,用於身分識別驗證
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK預設配置建立設定物件,並設定認證提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # 設定設定物件的地區屬性,根據使用者提供的命令列參數
    cfg.region = args.region

    # 如果提供了自訂endpoint,則更新設定物件中的endpoint屬性
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 使用上述配置初始化OSS用戶端,準備與OSS互動
    client = oss.Client(cfg)

    # 構建視頻截幀參數
    style = "video/snapshots,f_jpg,w_100,h_100,scaletype_crop,inter_10000"

    # 對目標儲存空間名和檔案名稱進行Base64編碼,以確保它們可以在URL中安全傳輸
    target_bucket_base64 = base64.b64encode(args.target_bucket.encode()).decode()
    target_key_base64 = base64.b64encode(args.target_key.encode()).decode()

    # 構建處理指示,包含樣式和儲存位置
    process = f"{style}|sys/saveas,o_{target_key_base64},b_{target_bucket_base64}"

    # 發送非同步請求以處理指定對象並按照給定的樣式儲存到目標儲存空間
    result = client.async_process_object(oss.AsyncProcessObjectRequest(
        bucket=args.bucket,  # 儲存空間名
        key=args.key,  # 對象鍵名
        process=process,  # 處理指示
    ))

    # 列印操作結果的狀態代碼和其他相關資訊,以便確認請求狀態和處理結果
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' event id: {result.event_id},'
          f' task id: {result.task_id},'
          f' process request id: {result.process_request_id},'
          )

# 當此指令碼被直接執行時,調用main函數開始處理邏輯
if __name__ == "__main__":
    main()  # 指令碼進入點,控製程序流程從這裡開始

音頻轉碼

您可以通過音頻轉碼功能,將音頻轉換為需要的格式。

import base64
import argparse
import alibabacloud_oss_v2 as oss

# 建立命令列參數解析器,並描述指令碼用途:非同步處理對象
parser = argparse.ArgumentParser(description="async process object sample")

# 定義命令列參數,包括必需的地區、儲存空間名稱、endpoint、對象鍵名以及目標儲存空間和映像名稱
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the object.', required=True)
parser.add_argument('--target_key', help='Specify the name of the processed object.', required=True)
parser.add_argument('--target_bucket', help='Specify the name of the bucket used to store processed object.', required=True)

def main():
    # 解析命令列參數,擷取使用者輸入的值
    args = parser.parse_args()

    # 從環境變數中載入訪問憑證資訊,用於身分識別驗證
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK預設配置建立設定物件,並設定認證提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # 設定設定物件的地區屬性,根據使用者提供的命令列參數
    cfg.region = args.region

    # 如果提供了自訂endpoint,則更新設定物件中的endpoint屬性
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 使用上述配置初始化OSS用戶端,準備與OSS互動
    client = oss.Client(cfg)

    # 構建音頻處理樣式字串以及音頻轉碼處理參數
    style = "audio/convert,ss_10000,t_60000,f_aac,ab_96000"

    # 對目標儲存空間名和檔案名稱進行Base64編碼,以確保它們可以在URL中安全傳輸
    target_bucket_base64 = base64.b64encode(args.target_bucket.encode()).decode()
    target_key_base64 = base64.b64encode(args.target_key.encode()).decode()

    # 構建處理指示,包含樣式和儲存位置
    process = f"{style}|sys/saveas,o_{target_key_base64},b_{target_bucket_base64}"

    # 發送非同步請求以處理指定對象並按照給定的樣式儲存到目標儲存空間
    result = client.async_process_object(oss.AsyncProcessObjectRequest(
        bucket=args.bucket,  # 儲存空間名
        key=args.key,  # 對象鍵名
        process=process,  # 處理指示
    ))

    # 列印操作結果的狀態代碼和其他相關資訊,以便確認請求狀態和處理結果
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' event id: {result.event_id},'
          f' task id: {result.task_id},'
          f' process request id: {result.process_request_id},'
          )

# 當此指令碼被直接執行時,調用main函數開始處理邏輯
if __name__ == "__main__":
    main()  # 指令碼進入點,控製程序流程從這裡開始

解析圖片盲浮水印

以下代碼展示了如何解析圖片中的盲浮水印。

import base64
import argparse
import alibabacloud_oss_v2 as oss

# 建立命令列參數解析器,並描述指令碼用途:非同步處理對象(如影像處理)
parser = argparse.ArgumentParser(description="async process object sample")

# 定義命令列參數,包括必需的地區、儲存空間名稱、endpoint、對象鍵名以及目標儲存空間和映像名稱
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the object.', required=True)
parser.add_argument('--target_key', help='Specify the name of the processed object.', required=True)
parser.add_argument('--target_bucket', help='Specify the name of the bucket used to store processed object.', required=True)

def main():
    # 解析命令列參數,擷取使用者輸入的值
    args = parser.parse_args()

    # 從環境變數中載入訪問憑證資訊,用於身分識別驗證
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK預設配置建立設定物件,並設定認證提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # 設定設定物件的地區屬性,根據使用者提供的命令列參數
    cfg.region = args.region

    # 如果提供了自訂endpoint,則更新設定物件中的endpoint屬性
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 使用上述配置初始化OSS用戶端,準備與OSS互動
    client = oss.Client(cfg)

    # 提取指定圖片中的浮水印內容
    style = "image/deblindwatermark,s_low,t_text"

    # 對目標儲存空間名和檔案名稱進行Base64編碼,以確保它們可以在URL中安全傳輸
    target_bucket_base64 = base64.b64encode(args.target_bucket.encode()).decode()
    target_key_base64 = base64.b64encode(args.target_key.encode()).decode()

    # 構建處理指示,包含樣式和儲存位置
    process = f"{style}|sys/saveas,o_{target_key_base64},b_{target_bucket_base64}"

    # 發送非同步請求以處理指定對象並按照給定的樣式儲存到目標儲存空間
    result = client.async_process_object(oss.AsyncProcessObjectRequest(
        bucket=args.bucket,  # 儲存空間名
        key=args.key,  # 對象鍵名
        process=process,  # 處理指示
    ))

    # 列印操作結果的狀態代碼和其他相關資訊,以便確認請求狀態和處理結果
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' event id: {result.event_id},'
          f' task id: {result.task_id},'
          f' process request id: {result.process_request_id},'
          )

# 當此指令碼被直接執行時,調用main函數開始處理邏輯
if __name__ == "__main__":
    main()  # 指令碼進入點,控製程序流程從這裡開始

相關文檔