В настоящее время я разрабатываю потоковую службу 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, если я не ошибаюсь) приводит к тому, что:
- Клиент GitHub webhoook истекает и отображает полезную нагрузку как недоставленные (хотя на стороне сервера все работало нормально - просто клиент не мог ждать достаточно долго, чтобы получить ожидаемый ответ).
- Сначала я не могу ответить, а затем вызвать
onpush
, так как отвечающий = возврат из функции .
Так что я в значительной степени ищу способ заставить эту вещь реагировать достаточно быстро, чтобы GitHub не истечет время ожидания, пока все еще в состоянии git pull
. Возможно, это можно решить с помощью небольшого количества параллелизма или многопоточности, но я действительно не знаю как.