编写用于AWS Lambda的asyncio代码的正确方法是什么?

时间:2017-04-25 02:39:37

标签: python python-3.x amazon-web-services aws-lambda python-asyncio

我写了以下代码:


import asyncio

loop = asyncio.get_event_loop()

async def get_urls(event):

    return {'msg':'Hello World'}

def lambda_handler(event,context):

    return loop.run_until_complete(get_urls(event))

我试图完成以下但更快。


def lambda_handler(event, context):
    # TODO implement
    return {'msg':'Hello World'}

在AWS Lambda环境中编写此代码的正确方法是什么?

4 个答案:

答案 0 :(得分:1)

异步执行同时执行许多操作。你只做一件事。你不能比做一件事所花费的时间更快。异步执行允许您执行通常一个接一个地(同步)同时执行的独立任务,然后返回所有任务的结果。本质上,您必须执行多个操作。

答案 1 :(得分:1)

为我工作...您需要选择运行时“ Python 3.6”或“ Python 3.7”。

enter image description here

答案 2 :(得分:1)

对于Python 3.7+,您可以使用asyncio.run()执行协程:

import asyncio

# The AWS Lambda handler
def handler(event, context):
    asyncio.run(main())

async def main():
    # Here you can await any awaitable
    await asyncio.sleep(1)
    await asyncio.gather([coroutine_1, coroutine_2])

这是如何在AWS Lambda上使用asyncio,aiohttp和aiobotocore开发,测试和部署异步Python函数的完整示例:https://github.com/geeogi/async-python-lambda-template

答案 3 :(得分:0)

需要将aioboto3作为部署zip软件包的一部分本地安装 `

import (
    "fmt"
    "math/rand"
    "strconv"
    "testing"
    "time"
)

func TestMap(t *testing.T) {
    s1 := rand.NewSource(time.Now().UnixNano())
    r1 := rand.New(s1)
    data := fill(r1.Intn(100))

    timer := time.NewTimer(10 * time.Second)

    go func() {
        s1 := rand.NewSource(time.Now().UnixNano())
        r1 := rand.New(s1)

        for {
            select {
            case <-timer.C:
                return
            default:

            }
            p := r1.Intn(100)
            v := fill(p)
            data = v
            fmt.Println("_p=" + strconv.Itoa(p))
        }
    }()

    for range []int{1, 2, 3, 4, 5, 6, 7, 8} {
        go func() {
            s1 := rand.NewSource(time.Now().UnixNano())
            r1 := rand.New(s1)
            for {

                select {
                case <-timer.C:
                    return
                default:

                }

                n := r1.Intn(100)
                s := strconv.Itoa(n)
                fmt.Println(data[s])
            }
        }()
    }

    <-timer.C
}

func fill(postfix int) map[string][]string {
    m := make(map[string][]string)
    for i := 0; i < 100; i++ {
        s := strconv.Itoa(i)
        m[s] = []string{s + "_" + strconv.Itoa(postfix)}
    }
    return m
}

`