我正在制作一个上传程序,而且我遇到了一个问题。我没有去处理将部件上传到大文件的例程。本质上,它会将文件拆分为100MB块,并根据您在配置中指定的并发进程数量同时上传它们。
我遇到的问题是当我创建一个缓冲区来读取文件并上传make([]字节,100000000)时,它会挂起......但前提是它只是在一个go例程中。 (我使用100000000来简化上传计算)
这是一个例子。
这有效:https://play.golang.org/p/tkn8JVir9S
package main
import (
"fmt"
)
func main() {
buffer := make([]byte, 100000000)
fmt.Println(len(buffer))
}
这不是:https://play.golang.org/p/H8626OLpqQ
package
main
import (
"fmt"
)
func main() {
go createBuffer()
for {
}
}
func createBuffer() {
buffer := make([]byte, 100000000)
fmt.Println(len(buffer))
}
它只是挂起......我不确定是否存在针对go例程的内存约束?我试图研究,看看我能找到什么,但没有。任何想法都将不胜感激。
编辑:感谢大家的反馈。我会说我没有很好地解释真正的问题,并会在下次尝试提供更多的整体观点。我最终使用了一个阻止通道来保持我的goroutine准备好处理新文件。这是为了将DR备份上传到第三方,所有这些都需要将大文件拆分为100mb块。我想我应该更清楚我的程序的性质。
答案 0 :(得分:1)
此程序挂起,因为代码中存在无限循环。尝试运行这样的代码来证明这一点。 goroutine不是造成悬挂的原因。
func main() {
for {
}
}
如果您只是希望看到fmt.Println(..)
打印,那么我建议您拨打time.Sleep
电话或类似电话。
如果您想等待一堆goroutine完成,那么我建议this excellent answer来解决这个问题。
答案 1 :(得分:0)
import "runtime"
func Gosched()
Gosched产生处理器,允许其他goroutines运行。它 不暂停当前goroutine,因此执行恢复 自动。
当你做一些奇怪的事情(for {}
和100MB
)时,你会得到奇怪的结果。做一些合理的事。例如,
package main
import (
"fmt"
"runtime"
)
func main() {
go createBuffer()
for {
runtime.Gosched()
}
}
func createBuffer() {
buffer := make([]byte, 100000000)
fmt.Println(len(buffer))
}
输出:
100000000
^Csignal: interrupt