Python3 нить на AWS лямбда - PullRequest
       84

Python3 нить на AWS лямбда

0 голосов
/ 25 апреля 2020

Я использую flask, и у меня есть маршрут для отправки электронных писем людям. Я использую потоки, чтобы отправить их быстрее. Когда я запускаю его на своей локальной машине, отправка 300 электронных писем занимает около 12 секунд. Но когда я запускаю его на полном лямбда-шлюзе 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 ''

1 Ответ

0 голосов
/ 25 апреля 2020

AWS лямбда-функции, предназначенные для запуска функций в следующих ограничениях:

Память– Объем памяти, доступный функции во время выполнения. Выберите объем от 128 МБ до 3 008 МБ с шагом 64 МБ.

Lambda распределяет мощность ЦП линейно пропорционально объему настроенной памяти. При 1792 МБ функция эквивалентна одному полному vCPU (одна vCPU-секунда кредитов в секунду).

Timeout - время, в течение которого Lambda позволяет функции запускаться до ее остановки. По умолчанию это 3 секунды. Максимально допустимое значение составляет 900 секунд.

Чтобы добавить это в свою почту, отправьте многопоточный код python. Функция автоматически завершится либо после успешного выполнения вашей функции, либо по истечении установленного времени ожидания.

Я понимаю, что вы хотите, чтобы одна функция python отправляла n сообщений электронной почты "одновременно". Чтобы добиться этого с помощью лямбды, попробуйте параметр «Параллелизм» и запустите вашу лямбда-функцию с помощью локального сценария S3, размещенного в html / js, запускаемого наблюдателем в облаке или экземпляром EC2.

Параллелизм - зарезервируйте параллелизм для функции для установить максимальное количество одновременных исполнений для функции. Обеспечение параллелизма, чтобы гарантировать, что функция может масштабироваться без колебаний задержки.

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

Внимание! Все вышеперечисленные настройки значительно повлияют на стоимость выполнения лямбда-функции. Поэтому планируйте и сравнивайте перед подачей заявки.

Если вам нужна дополнительная помощь, дайте мне знать.

Спасибо.

...