创建切片字节goroutine挂起

时间:2017-11-22 14:56:34

标签: go

我正在制作一个上传程序,而且我遇到了一个问题。我没有去处理将部件上传到大文件的例程。本质上,它会将文件拆分为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块。我想我应该更清楚我的程序的性质。

2 个答案:

答案 0 :(得分:1)

此程序挂起,因为代码中存在无限循环。尝试运行这样的代码来证明这一点。 goroutine不是造成悬挂的原因。

func main() {
    for {
    }
}

如果您只是希望看到fmt.Println(..)打印,那么我建议您拨打time.Sleep电话或类似电话。

如果您想等待一堆goroutine完成,那么我建议this excellent answer来解决这个问题。

答案 1 :(得分:0)

  

Package runtime

import "runtime"
     

func Gosched

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