首页 > 解决方案 > 部署 Python Web 应用程序后出现 App Engine 错误 - BlockingIOError: [Errno 11] 资源暂时不可用

问题描述

我在 Python 3.7 的标准环境中运行我的 Web 应用程序,当我在本地测试它时一切正常。但是,在我部署我的应用程序后,当应用程序尝试将文件保存到/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 上或上是否缺少某种类型的配置文件设置。我还尝试在 glcoud shell 上找到 gunicorn 文件,但它们没有出现在目录中。

我注意到,当我对文件进行新的更改并重新部署应用程序时,我的应用程序会随机正常工作,但是它只会工作一次,然后如果我立即尝试再次运行该功能,它就会失败。这是我收到的错误:

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

标签: pythonpython-3.xgoogle-app-enginegoogle-cloud-platformgunicorn

解决方案


文件系统

运行时包括一个完整的文件系统。文件系统是只读的,除了 location /tmp,它是一个在 App Engine 实例的 RAM 中存储数据的虚拟磁盘。

所以:

  • 使用除此之外的任何位置/tmp都行不通
  • 可用空间的数量是有限的。因此,您的应用需要注意在使用后删除临时文件。您描述的行为表明可用空间可能仅够您的 1 个文件使用。

要考虑的另一件事是多个并行请求:如果每个此类请求都可以创建自己的文件,则可能会遇到错误,因为不同的此类请求将同时写入多个文件。添加一个限制并行处理请求数量的方案将是一种可能的方法。

虽然不是 100% 确定,但我怀疑该限制可能取决于实例的 RAM 总量,在这种情况下,您的应用程序配置的实例类也很重要。要检查这是否属实,只需临时配置一个具有更多 RAM 的实例类,看看是否有帮助(例如,在不清理文件的情况下,它可能会在遇到错误之前多次工作)。

如果上述怀疑得到证实,那么选择适当的实例类也可能是解决问题的一种方法。

尽管应用了上述所有方法,但仍有可能遇到问题,例如,如果您正在编写的某些文件太大。如果是这样,那么使用本地文件系统不适合您的应用程序。一种可能的替代方法是将您的文件存储在 Google Cloud Storage (GCS)中。


推荐阅读