簡體   English   中英

Python3.8 Asyncio - 從字典列表中返回結果

[英]Python3.8 Asyncio - Return Results from List of Dictionaries

我真的很難弄清楚如何使用 asyncio 從一堆 AWS Lambda 調用中返回一堆結果,這是我的例子。

我的團隊擁有一堆 AWS 賬戶。 為了節省時間,我想運行一個異步的 AWS lambda 函數來處理每個帳戶的信息,並返回結果。 我試圖了解如何創建異步發送一大堆帳戶,而不是一次發送一個。 這是我的示例代碼。

def call_lambda(acct):

    aws_lambda = boto3.client('lambda', region_name='us-east-2')
    aws_payload = json.dumps(acct)

    response = aws_lambda.invoke(
    FunctionName='MyLambdaName',
    Payload=aws_payload,
    )

    return json.loads(response['Payload'].read())

def main():
    scan_time = datetime.datetime.utcnow()
    accounts = []
    scan_data = []
    account_data = account_parser()

    for account_info in account_data:
        account_info['scan_time'] = scan_time

    for account in account_data:
        scan_data.append(call_lambda(account))

我正在努力弄清楚如何以 asyncio 風格做到這一點。 我最初設法使用並發期貨線程池執行器來實現它,但我遇到了一些性能問題,但這就是我所擁有的。

executor = concurrent.futures.ThreadPoolExecutor(max_workers=50)
sg_data = executor.map(call_lambda, account_data)

所以這行得通,但效果不佳,我被告知改用 asyncio。 我閱讀這些下面的文章,但我仍然只是失去了對如何使這項工作。 我知道 AWS Lambda 本身是異步的,在沒有協程的情況下應該可以正常工作。

tl; dr 是我想為列表中的每個字典啟動 call_lambda(acct)(account_data 是一個字典列表),然后再次將所有結果返回到一個大的字典列表中。 (這最終會被寫入 CSV,公司政策問題,為什么不進入數據庫)。

我已經閱讀了以下內容,仍然感到困惑......

https://stackabuse.com/python-async-await-tutorial/

Lambda 調用默認是同步的 (RequestResponse),因此您必須將 InvocationType 指定為 Event。 通過這樣做,雖然您沒有得到整理您想要的帳戶信息的回復。 因此希望使用異步或類似的東西。

response = client.invoke(
    FunctionName='string',
    InvocationType='Event'|'RequestResponse'|'DryRun',
    LogType='None'|'Tail',
    ClientContext='string',
    Payload=b'bytes'|file,
    Qualifier='string'
)

我沒有在 lambda 中實現異步,但作為替代解決方案,如果您可以創建一個 s3 文件,然后每次調用 FunctionName='MyLambdaName' 只需更新文件,您可能會以這種方式獲得所需的內容。

暫無
暫無

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

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