簡體   English   中英

如何在 python 中為 aws dynamodb 創建常量 object?

[英]How to create constent object for aws dynamodb in python?

我想知道如何檢查 boto3 客戶端 object 是否已經實例化。 我有以下代碼用於為 aws dynamodb 創建 object

import boto3
def aws_dynamodb():
   return boto3.resource("dynamodb")


def get_db_con():
    dynamo_conn=aws_dynamodb()
    return dynamo_conn       

現在上面的 'get_db_con()' 返回到 dynamodb 的連接。 但我想確保“get_db_con”每次被調用時都不會從“aws_dynamodb()”創建客戶端 object。

例如:


def aws_db_table(table):
   con=get_db_con()
   return con.table(table)

account_table=aws_db_table("my_ac_table")
audit_table=aws_db_table("audit_table")

所以在這里每當我調用“aws_db_table”時,它不應該每次都為“aws_dynamodb()”創建客戶端。

那么如果 aws_dynamodb() 已經實例化或者沒有創建新的客戶端 object,我該如何檢查它。 因為每次創建客戶端 object 的成本很高。

注意:我想運行 Lambda function 中的代碼

請幫助我們。

謝謝

我通常使用 go 的低技術解決方案,其全局變量看起來像這樣:

import boto3

# Underscore-prefix to indicate this is something private
_TABLE_RESOURCE = None

def get_table_resource():
    global _TABLE_RESOURCE
    if _TABLE_RESOURCE is None:
        _TABLE_RESOURCE = boto3.resource("dynamodb").Table("my_table")
    return _TABLE_RESOURCE

def handler(event, context):
    table = get_table_resource()
    # ...

全局變量在 Lambda 執行中保持不變,這就是它起作用的原因。

另一種選擇是使用來自 functools 的lru_cache ,它使用 memoization。

from functools import lru_cache
import boto3

@lru_cache(maxsize=128)
def get_table_resource():
    return boto3.resource("dynamodb").Table("my_table")

def handler(event, context):
    table = get_table_resource()
    # ...

對於那些不熟悉記憶的人來說,第一個解決方案可能更容易閱讀和理解。 (注:我從memory寫代碼,可能有bug)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM