2016-07-25 5 views
2

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

  1. Benötige ich eine Sperre jedes Mal wenn ich erwerben in Buchse schreiben?
  2. Wenn ja, dann ist der Zweck der Erfassung der Sperre in Write-Implementierung besiegt.
  3. 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?)
  4. Hat der WSASend auf Windows implementiert die äquivalente Schleife in Unix Implementierung
+0

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

+0

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

+0

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

Antwort

0
  1. Die io.Write sagt, dass im Falle einer teilweisen Schreib, err wird! = Nil

  2. gefunden here auf Stackoverflow, dass WSASend brauchen nicht eine Schleife haben um ihn herum.

  3. Von # 1 & # 2, bedeutet es, dass ich keine Sperre erwerben muss, bevor net.Conn.Write aufgerufen wird.

Also meine Frage steht beantwortet.

4

Ja, können Sie viele Anrufe an eine net.Conn ‚s Schreibverfahren parallel machen.

Teil des Vertrags net.Conn ist, dass es von mehreren Goroutines gleichzeitig verwendet werden kann. Dies wird explizit in its documentation:

aufgerufen Conn ist eine generische stream-orientierte Netzwerkverbindung.

Mehrere Gloutinen können gleichzeitig Methoden auf einem Conn aufrufen.

Obwohl ich nicht mit der Windows-Implementierung sprechen kann, gilt diese Aussage für alle Plattformen. Da in der Windows-Implementierung keine Schleife vorhanden ist, müssen die Aufrufe WSASend garantieren, dass die Unix-API dies nicht tut.