У меня есть приложение flask, которое выполняет некоторые вычисления, и я делаю запросы к ноутбуку Jupyter. Код на стороне клиента соответствует основному c формату:
outputs = []
for batch in request_batches:
response = requests.post(flask_address, json=json.dumps(batch), timeout=3600)
outputs.append(response)
Идея состоит в том, чтобы выполнить итерацию серии пакетов запросов (пакетирование имеет смысл для приложения) и собрать ответы.
Обычно, что происходит для каждой партии, я вижу запрос, зарегистрированный на стороне приложения Flask, вместе с подтверждением Post после завершения вычисления.
00.000.000.000 - - [29/Apr/2020 02:21:46] "POST //docking HTTP/1.1" 200 -
После завершения одной партии l oop продолжается и следующий запрос отправляется.
Проблема, с которой я сталкиваюсь, иногда заключается в том, что вычисление размера Flask занимает немного больше времени, чем обычно, и это вызывает запрос l oop в зависание ноутбука (обратите внимание, что это больше, чем обычно, на несколько минут, что намного меньше установленного периода ожидания). При размере Flask вычисление успешно завершается, и появляется сообщение Post.
При размере ноутбука l oop зависает и дальнейшие запросы не выполняются. Это не проблема тайм-аута - нет ошибок тайм-аута. Ячейка ноутбука просто зависает, пока я не прерываю ее вручную.
Когда я прерываю, я вижу следующую трассировку стека:
~/opt/anaconda3/envs/env/lib/python3.7/socket.py in readinto(self, b)
587 while True:
588 try:
--> 589 return self._sock.recv_into(b)
590 except timeout:
591 self._timeout_occurred = True
После прерывания я могу подтвердить, что ответ, вызывающий l oop чтобы зависание не было добавлено к выводам. Так что каким-то образом приложение Flask отправляет ответ, но ответ не поступает в блокнот клиента. Опять же, 95% времени это работает нормально, но 5%, когда запрос обрабатывается дольше, приводит к зависанию запроса oop.
Кто-нибудь знает, как go отладить это?