Ошибка App Engine после развертывания веб-приложения Python - BlockingIOError: [Errno 11] Ресурс временно недоступен - PullRequest
0 голосов
/ 28 февраля 2019

Я запускаю свое веб-приложение в стандартной среде на Python 3.7, и когда я тестирую его локально, все работает нормально.Однако после развертывания приложения я получаю следующую ошибку, когда приложение пытается сохранить файлы в указанном мною месте /tmp:

BlockingIOError: [Errno 11] Resource temporarily unavailable

Вот как обозначается путь для сохранения кака также имя файла.

file_num = os.urandom(10).hex()

handle, path = tempfile.mkstemp()

ytdl_format_options = {'format': 'bestaudio/best','outtmpl':path + 'song'+ file_num +'.mp3', 'quiet': True}

Я не уверен, что является причиной этой ошибки или есть какой-то тип настроек файла конфигурации, который мне не хватает ни на app.yaml, ни на gunicorn.Я также попытался найти файлы gunicorn в оболочке glcoud, но они не отображаются в каталоге.

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

Traceback (most recent call last):
  File "/env/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 279, in handle
    keepalive = self.handle_request(req, conn)
  File "/env/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 348, in handle_request
    six.reraise(*sys.exc_info())
  File "/env/lib/python3.7/site-packages/gunicorn/six.py", line 625, in reraise
    raise value
  File "/env/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 331, in handle_request
    resp.write_file(respiter)
  File "/env/lib/python3.7/site-packages/gunicorn/http/wsgi.py", line 403, in write_file
    if not self.sendfile(respiter):
  File "/env/lib/python3.7/site-packages/gunicorn/http/wsgi.py", line 393, in sendfile
    sent += sendfile(sockno, fileno, offset + sent, count)
BlockingIOError: [Errno 11] Resource temporarily unavailable

1 Ответ

0 голосов
/ 01 марта 2019

С Файловая система :

Среда выполнения включает полную файловую систему.Файловая система доступна только для чтения, за исключением расположения /tmp, которое представляет собой виртуальный диск, на котором хранятся данные в оперативной памяти вашего экземпляра App Engine.

Итак:

  • с использованием любогорасположение, отличное от /tmp, не будет работать
  • количество свободного места ограничено.Из-за этого ваше приложение должно позаботиться об удалении временных файлов после использования.Поведение, которое вы описываете, предполагает, что доступного места может быть достаточно только для одного из ваших файлов.

Еще одна вещь, которую следует учитывать, - это множественные параллельные запросы: если каждый такой запрос может создать свой собственный файл, то ошибкаможно ударить, потому что несколько файлов будут записываться одновременно разными запросами.Добавление схемы, ограничивающей число запросов, обрабатываемых параллельно, было бы возможным подходом.

Хотя я не уверен на 100%, я подозреваю, что ограничение может также зависеть от общего объема ОЗУ экземпляра,в этом случае также будет иметь значение настроенный экземпляр класса вашего приложения .Чтобы проверить, так ли это, просто временно настройте класс экземпляра с большей оперативной памятью и посмотрите, поможет ли это (например, без очистки файлов может сработать несколько раз, прежде чем произойдет ошибка).

Если вышеупомянутое подозрение подтверждается, то выбор подходящего класса экземпляра также может быть подходом для решения проблемы.

Несмотря на применение всего вышеперечисленного, возможно, удастся решить проблему, посколькуНапример, если некоторые из файлов, которые вы пишете, просто слишком велики.Если это так, то использование локальной файловой системы не подходит для вашего приложения.Возможной альтернативой будет хранить ваши файлы в Google Cloud Storage (GCS) .

...