Увеличьте время ожидания от команды slack sla sh в python "operation_timeout" - PullRequest
1 голос
/ 13 марта 2020

Я запускаю ниже python скрипт, который в итоге запускает скрипт оболочки, который дает мне список запущенных версий в пространстве имен k8s. Получение результата, но это занимает время> 3se c. Таким образом, это вызывает "operation_timeout" из слабины. Я новичок в python, прошел с различными документами относительно задержки, но это не помогло, поскольку они были очень сложными.

from subprocess import Popen, PIPE
from subprocess import check_output
from flask import Flask

def get_shell_script_output_using_communicate():
    session = subprocess.Popen(['./version.sh'], stdout=PIPE, stderr=PIPE)
    stdout, stderr = session.communicate()
    if stderr:
        raise Exception("Error "+str(stderr))
    return stdout.decode('utf-8')

def get_shell_script_output_using_check_output():
    stdout = check_output(['./version.sh']).decode('utf-8')
    return stdout

app = Flask(__name__)

@app.route('/test',methods=['POST'])
def home():
    return '`Version List` ```'+get_shell_script_output_using_check_output()+'```'

app.run(host='0.0.0.0', port=5002, debug=True)

Есть ли способ получить ответ, даже если команда принимает больше чем 10се c? Спасибо!

1 Ответ

1 голос
/ 14 марта 2020

Невозможно увеличить время ожидания по умолчанию с команд Slack до sla sh. Это всегда 3 секунды. Но можно отправить отложенный ответ на срок до 30 минут.

Для этого вам необходимо сначала ответить в течение 3 секунд, чтобы подтвердить первоначальный запрос, отправив обратно HTTP 200 OK. Поскольку для этого требуется выполнить текущий запрос и завершить работу основного сценария, необходимо параллельно запустить функцию для отложенного ответа. Это может быть в процессе, потоке, при вызове задачи сельдерея или любых других средств, которые позволяют вам запустить параллельную запущенную функцию python.

Параллельная функция может затем ответить на Slack, отправив сообщение URL, предоставленный в response_url из запроса Slack.

Вот пример реализации, использующей потоки:

import threading
from time import sleep
from flask import Flask, json, request
import requests

app = Flask(__name__) #create the Flask app

@app.route('/slash', methods=['POST'])
def slash_response():                
    """endpoint for receiving all slash command requests from Slack"""

    # get the full request from Slack
    slack_request = request.form

    # starting a new thread for doing the actual processing    
    x = threading.Thread(
            target=some_processing,
            args=(slack_request,)
        )
    x.start()

    ## respond to Slack with quick message
    # and end the main thread for this request
    return "Processing information.... please wait"


def some_processing(slack_request):
    """function for doing the actual work in a thread"""

    # lets simulate heavy processing by waiting 7 seconds
    sleep(7)

    # response to Slack after processing is finished
    response_url = slack_request["response_url"]    
    message = {        
        "text": "We found a result!"
    }
    res = requests.post(response_url, json=message)

if __name__ == '__main__':
    app.run(debug=True, port=8000) #run app in debug mode on port 8000
...