Wenn Sie versuchen, aus dem Socket zu lesen, kann dies blockieren Ich möchte es mit Kontext abbrechen können.
Ich möchte den folgenden Code wenn möglich schreiben, kann ihn aber nicht ausführen. Notieren Sie sich daher die Alternative
select {
case size, err := conn.Read():
// Abkürzung
case <-ctx.Done():
//略
}
Verwenden Sie Set Deadline wie folgt. Abhängig von der Fristeinstellungszeit kann sich die Antwortzeit auf "ctx.Done ()" erhöhen. Ich denke, dass die Antwortzeitanforderung an ctx.Done () viel lockerer ist als die Antwortzeitanforderung an Read, daher sollte dies kein Problem sein.
continue_read := true
for continue_read {
err := conn.SetReadDeadline(time.Now().Add(time.Millisecond * 500))
if err != nil {
return err
}
size, err := conn.Read(buf)
switch {
case err == nil || os.IsTimeout(err):
continue_read = true // Do nothing
case errors.Is(err, io.EOF):
continue_read = false
default:
return err
}
//Schreiben Sie Buf-Operationen usw.
select {
case <-ctx.Done():
return ctx.Err()
default:
}
}
Nun, das Problem wurde gelöst, aber es ist nicht sehr schön, deshalb möchte ich etwas dagegen tun.
Recommended Posts