Ich habe mehrere Goroutines, die sich ein net.Conn-Objekt teilen. Können sie gleichzeitig Anrufe schreiben?Golang net.Conn Parallel schreiben
Mein Hauptanliegen ist das Schreiben von Aufrufen, die teilweise erledigt sind. Sagen wir, ich beabsichtige, 100 Bytes zu schreiben, aber nur 30 wurden gesendet, also muss ich 70 weitere senden. Dazu schreibe ich normalerweise eine Schleife:
count := 0
for count < len(buf) {
byteSent, err := conn.Write(buf[count:])
//check error
count += byteSent
}
Aber ich sehe, dass Go diese Schleife in net.Conn.Write Zeilennummer 318 implementiert und es tut dies durch eine Sperre nehmen.
Jedoch unter Windows Implementierung gibt es keine solche Schleife, außer dass es einen Aufruf an WSASend gibt. Ich weiß nicht, wie WSASend verhält und konnte nicht viel von den MSDN-Dokumentation
Daher sind die Fragen bekommen sind:
[Bearbeiten] 4. Frage hinzugefügt
- Benötige ich eine Sperre jedes Mal wenn ich erwerben in Buchse schreiben?
- Wenn ja, dann ist der Zweck der Erfassung der Sperre in Write-Implementierung besiegt.
- In Unix-Implementierung, bedeutet es, dass ich ByteSent < len (buf) nicht erhalten kann, es sei denn err! = Nil? (Ich meine lese ich den Code richtig?)
- Hat der WSASend auf Windows implementiert die äquivalente Schleife in Unix Implementierung
Die Dokumentation besagt: "Mehrere Göroutinen können Methoden auf einem Conn gleichzeitig aufrufen.". Wenn das nicht für alle Plattformen gilt, dann ist es ein Fehler, der behoben werden muss. – JimB
Sie haben Recht. Das einzige, was mich daran hindert, den Fehler zu speichern, ist, dass ich nicht weiß, ob WSASend die Schleife implementiert, die Unix-Impl entspricht oder nicht. Daher die Frage zu SO – user2248790
Normalerweise melden Sie einen Fehler, wenn Sie beweisen, dass es nicht richtig funktioniert. Andernfalls gehen Sie davon aus, dass der Code wie angekündigt funktioniert. – JimB