私が作業しているアップロードプログラムがあり、問題が発生しています。私は大きなファイルに部品をアップロードするルーチンを持っています。基本的には、ファイルを100MBのチャンクに分割し、configで指定した同時プロセスの量に応じて同時にアップロードします。スライスバイトのゴルーチンがハングアップする
問題は、ファイルを読み込んでmake([]バイト、100000000)がアップロードされるようにバッファを作成したときです...ただし、それが実行ルーチンにある場合のみです。 (アップロードの計算を簡略化するために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))
}
それはちょうどハング...私は行くルーチンのメモリ制約があるかどうかわかりませんか?私は何を見つけることができたのか、何も見つけられなかったことを研究してみました。いかなる考えも認められるだろう。
編集:フィードバックいただきありがとうございます。私は本当の問題をとてもうまく説明しなかったと言い、次回は全体像をより多く提供しようとします。私は、新しいファイルを処理するために自分のゴルーチンを準備しておくために、チャンネルを使ってブロックしました。これは、サードパーティにアップロードするDRバックアップのためのもので、大きなファイルを100MBのチャンクに分割する必要があります。私は自分のプログラムの性質についてより明確にすべきだったと思います。
あなたは、あなたのプログラムでビジーループを持っています。空のループを使う理由は決してありません。理由なくCPUの100%を消費しており、最終的にはランタイムをブロックします。 – JimB
for {}の代わりに 'select {}'を使うようにしてください。最良の方法ではありません(実行ルーチンが終了したときにチェックするためにチャネルを使用する必要があります)が、テスト目的では問題ありません。 – ajnavarro
goroutineにバイトスライスを割り当てることは、https://play.golang.org/p/8QawOUTFybのようにうまくいきます.JimBが既に指摘したように、あなたの例の問題はforループです。 – mkopriva