[英]Creating slice byte goroutine hangs
我有一個正在處理的上傳程序,遇到了問題。 我沒有處理將零件上傳到大文件的例程。 本質上,它將文件分割成100MB的塊,並根據您在配置中指定的並發進程數量並發上傳。
我遇到的問題是當我創建一個緩沖區以讀取文件並上傳make([] byte,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的塊。 我想我應該對程序的性質更加清楚。
該程序掛起,因為您的代碼中存在無限循環。 嘗試像這樣運行代碼以向自己證明。 goroutine並不是導致掛起的原因。
func main() {
for {
}
}
如果您只想查看fmt.Println(..)
打印,那么我建議您進行time.Sleep
通話或類似的通話。
import "runtime"
func Gosched()
Gosched產生處理器,從而允許其他goroutine運行。 它不會掛起當前的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.