Ich habe ein Upload-Programm, das ich arbeite, und ich bin in ein Problem. Ich habe Routinen, die das Hochladen der Teile in eine große Datei übernehmen. Im Wesentlichen wird die Datei in 100 MB-Chunks aufgeteilt und gleichzeitig hochgeladen, abhängig von der Anzahl gleichzeitiger Prozesse, die Sie in der Konfiguration angeben.Erstellen von Slice-Byte-Goroutine hängt
Das Problem, das ich habe, ist, wenn ich einen Puffer erstellen, um die Datei zu lesen und laden Sie die make ([] Byte, 100000000) hängt ... aber nur, wenn es in einer Go-Routine ist. (Ich verwende 100000000, um die Upload-Berechnungen zu vereinfachen)
Hier ist ein Beispiel.
Dies funktioniert: https://play.golang.org/p/tkn8JVir9S
package main
import (
"fmt"
)
func main() {
buffer := make([]byte, 100000000)
fmt.Println(len(buffer))
}
Dies gilt nicht: 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))
}
Es hängt nur ... Ich bin nicht sicher, ob es eine Speicherbeschränkung für eine Go-Routine? Ich versuchte zu recherchieren und zu sehen, was ich finden konnte, aber nichts. Irgendwelche Gedanken würden geschätzt werden.
EDIT: Vielen Dank für das Feedback. Ich werde sagen, dass ich das wirkliche Problem nicht sehr gut erklärt habe und versuchen werde, das nächste Mal eine ganzheitliche Sichtweise zu bieten. Am Ende habe ich einen Kanal benutzt, um meine Gorino-Dateien für neue Dateien bereit zu halten. Dies ist für eine DR-Sicherung, die alle 3rd-Party-Dateien hochlädt, für die große Dateien in 100mb-Chunks aufgeteilt werden müssen. Ich denke, ich hätte mich über die Art meines Programms klar sein müssen.
Sie haben eine beschäftigt Schleife in Ihrem Programm. Es gibt nie einen Grund, eine leere Schleife zu verwenden.Es verbraucht nur 100% einer CPU ohne Grund und wird schließlich die Laufzeit blockieren. – JimB
Versuchen Sie 'select {}' anstelle von 'for {}' zu verwenden. Ist nicht der beste Ansatz (Sie sollten Kanäle dafür verwenden, um zu überprüfen, wenn die Go-Routinen fertig sind), aber zu Testzwecken ist es in Ordnung. – ajnavarro
Das Zuweisen eines Byte-Slices in einer Goroutine ist in Ordnung, wie Sie hier sehen können https://play.golang.org/p/8QawOUTFyb, das Problem in Ihrem Beispiel, wie bereits von JimB aufgezeigt, ist die for-Schleife. – mkopriva