我在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
答案 0 :(得分:1)
来自Filesystem:
运行时包括完整的文件系统。文件系统是只读的 位置
/tmp
除外,该位置是存储数据的虚拟磁盘 在您的App Engine实例的RAM中。
所以:
/tmp
以外的任何其他位置均无效要考虑的另一件事是多个并行请求:如果每个此类请求都可以创建自己的文件,则可能会出现错误,因为多个文件将由不同的此类请求同时写入。添加限制并行处理请求数量的方案将是一种可能的方法。
虽然我不能100%地确定限制可能也取决于实例的RAM总量,在这种情况下,您的应用配置的instance class也很重要。要检查是否为真,只需临时配置一个具有更多RAM的实例类,然后查看是否有帮助(例如,不清除文件,在遇到错误之前,它可能会多次工作)。
如果上述怀疑得到证实,那么选择适当的实例类也可能是解决问题的一种方法。
尽管应用了上述所有方法,仍然有可能解决该问题,例如,如果您正在编写的某些文件太大。如果是这样,那么使用本地文件系统不适合您的应用程序。可能的替代方法是改为store your files in Google Cloud Storage (GCS)。