[英]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.