繁体   English   中英

AWS 上的 Python3 线程 Lambda

[英]Python3 threading on AWS Lambda

我正在使用 flask,并且有一条向人们发送电子邮件的路线。 我正在使用线程来更快地发送它们。 当我在本地机器上运行它时,发送 300 封电子邮件大约需要 12 秒。 但是当我在 lambda through API 网关上运行它时,它会超时。 这是我的代码:

import threading

def async_mail(app, msg):
    with app.app_context():
        mail.send(msg)


def mass_mail_sender(order, user, header):
    html = render_template('emails/pickup_mail.html', bruger_order=order.ordre, produkt=order.produkt)
    msg = Message(recipients=[user],
                  sender=('Sender', 'infor@example.com'),
                  html=html,
                  subject=header)
    thread = threading.Thread(target=async_mail, args=[create_app(), msg])
    thread.start()
    return thread

@admin.route('/lager/<url_id>/opdater', methods=['POST'])
def update_stock(url_id):
    start = time.time()
    if current_user.navn != 'Admin':
        abort(403)
    if request.method == 'POST':
        produkt = Produkt.query.filter_by(url_id=url_id)
        nyt_antal = int(request.form['bestilt_hjem'])
        produkt.balance = nyt_antal
        produkt.bestilt_hjem = nyt_antal
        db.session.commit()
        orders = OrdreBog.query.filter(OrdreBog.produkt.has(func.lower(Produkt.url_id == url_id))) \
            .filter(OrdreBog.produkt_status == 'Ikke klar').all()
        threads = []
        for order in orders:
            if order.antal <= nyt_antal:
                nyt_antal -= order.antal
                new_thread = mass_mail_sender(order, order.ordre.bruger.email, f'Din bog {order.produkt.titel} er klar til afhentning')
                threads.append(new_thread)
                order.produkt_status = 'Klar til afhentning'
                db.session.commit()
        for thread in threads:
            try:
                thread.join()
            except Exception:
                pass
        end = time.time()
        print(end - start)
        return 'Emails sendt'
    return ''

AWS lambda 函数旨在在这些约束内运行函数:

内存——memory 在执行期间可用于 function 的数量。 在 128 MB 和 3,008 MB 之间选择一个数量,增量为 64 MB。

Lambda 分配 CPU 功率与 memory 配置的数量成线性比例。 在 1,792 MB 时,一个 function 相当于一个完整的 vCPU(每秒一个 vCPU 秒的积分)。

超时 – Lambda 允许 function 在停止之前运行的时间量。 默认值为 3 秒。 允许的最大值为 900 秒。

将此放入您的邮件中发送多线程 python 代码。 当您的 function 执行成功完成或达到配置的超时时,function 将自动终止。

我了解您希望单个 python function “同时”发送 n 封电子邮件。 要使用 lambda 实现此目的,请尝试“并发”设置并通过本地脚本触发您的 lambda function,S3 托管由云监视或 EC2 实例触发的 html/js。

并发性 – 为 function 保留并发性以设置 function 的最大同时执行数。提供并发性以确保 function 可以扩展而不会出现延迟波动。

https://docs.aws.amazon.com/lambda/latest/dg/configuration-console.html

重要提示:以上所有设置都会显着影响您的 lambda function 执行成本。 所以在申请之前计划和比较。

如果您需要更多帮助,请告诉我。

谢谢你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM