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

时间:2019-02-28 18:07:33

标签: python python-3.x google-app-engine google-cloud-platform gunicorn

我在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外壳上找到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

1 个答案:

答案 0 :(得分:1)

来自Filesystem

  

运行时包括完整的文件系统。文件系统是只读的   位置/tmp除外,该位置是存储数据的虚拟磁盘   在您的App Engine实例的RAM中。

所以:

  • 使用/tmp以外的任何其他位置均无效
  • 可用空间量有限。因此,您的应用需要在使用后删除临时文件。您描述的行为表明可用空间可能仅足以容纳您的文件之一。

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

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

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

尽管应用了上述所有方法,仍然有可能解决该问题,例如,如果您正在编写的某些文件太大。如果是这样,那么使用本地文件系统不适合您的应用程序。可能的替代方法是改为store your files in Google Cloud Storage (GCS)