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