Реализовать отложенный отклик Slack с косой чертой

Я хочу реализовать команду slack slash, которая должна обрабатывать функцию pipeline, которая занимает около 30 секунд. Теперь, поскольку команды Slack позволяют реагировать только на 3 секунды, как это реализовать? . Я сослался на это, но не знаю, как это реализовать.

Пожалуйста, подожди меня. Я делаю это впервые. Это то, что я пробовал. Я знаю, как ответить ok status в течение 3 секунд, но не понимаю, как снова позвонить pipeline

import requests
import json
from bottle import route, run, request
from S3_download import s3_download
from index import main_func

@route('/action')
def action():
        pipeline()
        return "ok"

def pipeline():
        s3_download()
        p = main_func()
        print (p)

if __name__ == "__main__":
      run(host='0.0.0.0', port=8082, debug=True)

Я наткнулся на эту статью. Является ли использование AWS lambda единственным решением? Разве мы не можем сделать это полностью на Python?


person prashantitis    schedule 07.10.2016    source источник
comment
Вы пробовали использовать очереди? В своем запросе на получение вы можете получить параметры запроса и сохранить их в очереди, а ваш рабочий процесс может обработать очередь и вернуться с ожидаемым ответом. Если нет, может быть, мы можем попробовать использовать фреймворк неблокирующих запросов, например, использовать торнадо вместо бутылки?   -  person Sirius    schedule 07.10.2016
comment
Вы можете объяснить с помощью сниппета или псевдокода? ваш первый подход   -  person prashantitis    schedule 07.10.2016


Ответы (2)


Что-то вроде этого:

from boto import sqs
@route('/action', method='POST')
def action():
    #retrieving all the required request example
    params = request.forms.get('response_url')

    sqs_queue = get_sqs_connection(queue_name)
    message_object = sqs.message.Message()
    message_object.set_body(params)
    mail_queue.write(message_object)
    return "request under process"

и у вас может быть другой процесс, который обрабатывает очередь и вызывает длительную функцию:

sqs_queue = get_sqs_connection(queue_name)
for sqs_msg in sqs_queue.get_messages(10, wait_time_seconds=5):
    processed_msg = json.loads(sqs_msg.get_body())
    response = pipeline(processed_msg)
    if response:
        sqs_queue.delete_message(sqs_msg)

вы можете запустить этот второй процесс, возможно, в отдельном файле Python diff, как процесс-демон или cron.

Я использовал здесь Amazon Queue sqs, но есть разные варианты .

person Sirius    schedule 07.10.2016

У вас есть один или два варианта сделать это в рамках одного процесса, но это чревато опасностями. Если вы развернете новый Thread для обработки длинного процесса, вы можете закончить развертывание или сбой в середине и потерять его.

Если для вас важна надежность, обратите внимание на рабочие фоновые задачи, такие как SQS, Lambda или даже очередь задач Celery, поддерживаемую Redis. В отдельной задаче есть несколько интересных режимов сбоя, и эти инструменты помогут вам справиться с ними лучше, чем просто создание потока.

person Ben Straub    schedule 07.10.2016