(Python, Flask) * Функция маршрута 1002 * занимает слишком много времени из-за ограничения ввода-вывода, поэтому время ожидания клиента - PullRequest
0 голосов
/ 24 апреля 2020

В настоящее время я разрабатываю потоковую службу musi c с нуля. Я делаю и задний и передний конец. У меня есть сервер, который я использую для тестирования на этом этапе разработки. Он имеет серверное приложение Go, а также клон репозитория GitHub, где я набираю sh мой Vue. js код для внешнего интерфейса.

Процесс развертывания прост. Как только я перейду в ветку master sh, я ssh войду на сервер, cd в папку проекта Vue. js, git pull, npm run build и вуаля! Поскольку это такая простая и предсказуемая задача, я хотел автоматизировать ее с помощью веб-хитов GitHub и Python Flask framework. Итак, я написал это (и это вроде работает):

# this snippet only shows the important bits

def onpush(event: str, info: Dict):
    subprocess.run(SCRIPT, stdout=LOG_FILE)

@app.route('/github', methods=['POST'])
def github() -> str:
    if request.headers['Content-Type'] != 'application/json':
        return '415 - unsupported media type'

    event: str = request.headers['X-GitHub-Event']
    info: Dict = request.json
    onpush(event, info) # takes too long! client times out since ...
    return '200 - OK'   # this return value is used as the response ...
                        # which means it's not sent until `onpush` is done

Однако функция onpush запускает git pull в своем вызове subprocess.run (что требует времени для извлечения данных с серверов GitHub) и ничего из этого не является параллельным. Таким образом, использование значения return '200 - OK' маршрута в качестве ответа сервера (что делает Flask, если я не ошибаюсь) приводит к тому, что:

  1. Клиент GitHub webhoook истекает и отображает полезную нагрузку как недоставленные (хотя на стороне сервера все работало нормально - просто клиент не мог ждать достаточно долго, чтобы получить ожидаемый ответ).
  2. Сначала я не могу ответить, а затем вызвать onpush, так как отвечающий = возврат из функции .

Webhooks call timed out

Так что я в значительной степени ищу способ заставить эту вещь реагировать достаточно быстро, чтобы GitHub не истечет время ожидания, пока все еще в состоянии git pull. Возможно, это можно решить с помощью небольшого количества параллелизма или многопоточности, но я действительно не знаю как.

...