簡體   English   中英

創建切片字節goroutine掛起

[英]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通話或類似的通話。

如果您想等待一堆goroutine完成,那么我將為這個確切的問題推薦出色的答案

包運行時

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM