【发布时间】:2021-07-22 03:51:46
【问题描述】:
我有这个代码(或多或少):
resp, err := http.Get(url)
if err != nil {
// handle error
}
if resp.StatusCode != http.StatusOK {
// handle error
}
out, err := os.Create(filepath)
if err != nil {
return err
}
// Write the body to file
_, err = io.Copy(out, resp.Body)
resp.Body.Close()
out.Close()
我的问题是,如果我立即尝试做某事(例如,获取此文件的哈希),那么我会看到它仍在复制一段时间。
起初我推迟了 out.Close(),但我认为我需要在 io.Copy 之后进行 out.Close,这将阻塞直到它完成。或者我是这么想的。 这没有用,我仍然有同样的问题。
如何阻止或等待 io.Copy 操作完成?
谢谢!
【问题讨论】:
-
@JimB 所说的 +1。如果这不能解决您的问题,也许您可以尝试在
out上调用Sync来强制执行fsync系统调用。 -
How do I block or wait for the io.Copy operation to finish?您编写指令来同步访问。或者以某种方式调用该函数将阻塞,直到它的工作完成,然后再继续执行另一个函数。我觉得你没有讲完整个故事。 -
有时我们不需要同步,我们可以一次完成所有的事情。 stackoverflow.com/questions/62319053/…
-
问题是,如果我等待它会起作用。如果我在循环中对文件进行采样,我会看到它会发生变化,直到它稳定(完成) - 例如在循环中获取哈希。它仍然失败,我添加了同步,它似乎工作(很难确定,这不是 100% 可重现的)。有什么理由应该调用同步吗?为什么我需要强迫它,似乎它无论如何都会发生。 @EmilePels - 你可以把它写成答案,我会接受它
-
@RoyCa 很高兴它有帮助。我已经提交了一个带有更详细解释的答案,并且我还在那里引用了一些文档。
标签: go