gpt4 book ai didi

ruby-on-rails - ruby IO.read() 是否锁定?

转载 作者:数据小太阳 更新时间:2023-10-29 07:58:06 25 4
gpt4 key购买 nike

我有一个读取照片并返回其字节数据的网络服务方法。我目前正在做以下事情:

@photo_bytes = IO.read("/path/to/file")
send_data(@photo_bytes, :filename => "filename", :type => "filetype", :disposition => "inline")

当我经常调用它时,我会遇到一些奇怪的行为......偶尔 send_data 会返回 null。我在想,如果文件尚未关闭,我可能正在阅读争用。使用 IO.read 打开文件后是否需要明确关闭文件?我如何使用 read_nonblock 来执行此操作,这样做是否值得?

更新:

所以我做了一些更多的日志记录,偶尔 IO.read 会返回一个像 1800 字节的值,而它通常返回 ~5800 字节的图片。当它返回 1800 字节时,图片不会显示在客户端上。当两个用户调用 Web 服务时,这种情况相当随机地发生。

谢谢

汤姆

最佳答案

IO.read 方法不执行任何建议文件锁定,因此不应受到其他并发读取器的影响。但是,如果您的应用程序中的其他地方有代码写入 到同一路径,您需要确保以原子方式更新文件。以写入(而非追加)模式打开文件会立即将文件截断为零字节,因此在写入新版本之前,您很可能会看到上述代码片段生成的空响应。

不过,假设您使用的是 *NIX 平台,例如 Linux 或 OS X,您可以使用如下代码以原子方式更新文件:

require 'tempfile'
require 'fileutils'

def safe_write(path, data)
tmp = Tempfile.new
tmp.write(data)
tmp.close
FileUtils.mv(tmp.path, path)
end

这会将数据写入临时文件,然后自动将其移动到 "/path/to/file" 位置,而读者永远不会看到零长度截断版本。

关于ruby-on-rails - ruby IO.read() 是否锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1359965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com