python - 部署 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
解决方案
从文件系统:
运行时包括一个完整的文件系统。文件系统是只读的,除了 location
/tmp
,它是一个在 App Engine 实例的 RAM 中存储数据的虚拟磁盘。
所以:
- 使用除此之外的任何位置
/tmp
都行不通 - 可用空间的数量是有限的。因此,您的应用需要注意在使用后删除临时文件。您描述的行为表明可用空间可能仅够您的 1 个文件使用。
要考虑的另一件事是多个并行请求:如果每个此类请求都可以创建自己的文件,则可能会遇到错误,因为不同的此类请求将同时写入多个文件。添加一个限制并行处理请求数量的方案将是一种可能的方法。
虽然不是 100% 确定,但我怀疑该限制也可能取决于实例的 RAM 总量,在这种情况下,您的应用程序配置的实例类也很重要。要检查这是否属实,只需临时配置一个具有更多 RAM 的实例类,看看是否有帮助(例如,在不清理文件的情况下,它可能会在遇到错误之前多次工作)。
如果上述怀疑得到证实,那么选择适当的实例类也可能是解决问题的一种方法。
尽管应用了上述所有方法,但仍有可能遇到问题,例如,如果您正在编写的某些文件太大。如果是这样,那么使用本地文件系统不适合您的应用程序。一种可能的替代方法是将您的文件存储在 Google Cloud Storage (GCS)中。
推荐阅读
- javascript - 我正在将对象属性的值从 false 更改为 true,但我的 v-show 条件并未反映这一点
- traefik - 我可以禁用指定路径的基本身份验证吗?
- php - 在PHP中的多维数组中合并取决于键值的数组
- powershell - 如何在 while 循环中附加 Web 请求结果
- php - 找到最多十度分离的最短路径
- netlogo - 如何报告链接之间的距离并将报告的值用于代码中的其他计算?
- html - 使 CSS 悬停工具提示超出其父级范围
- r - dplyr:按组汇总(总和)非常慢
- scala - 使用 Shapeless 的类与类型注释
- ruby-on-rails - 我正在尝试创建一种安全的方式来让特定用户成为管理员