Si vous essayez de lire à partir de la prise, cela peut bloquer, donc Je veux pouvoir l'annuler avec le contexte.
Je voudrais écrire le code suivant si possible, mais je ne peux pas le faire, alors prenez note de l'alternative
select {
case size, err := conn.Read():
// Abréviation
case <-ctx.Done():
//略
}
Utilisez Set Deadline comme ceci.
En fonction de l'heure de réglage du délai, le temps de réponse à ctx.Done ()
peut augmenter
Je pense que la demande de temps de réponse à ctx.Done () est beaucoup plus lâche que la demande de temps de réponse à Read, donc cela ne devrait pas être un problème.
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
}
//Ecrire des opérations buf, etc.
select {
case <-ctx.Done():
return ctx.Err()
default:
}
}
Eh bien, le problème a été résolu, mais ce n'est pas très beau, alors j'aimerais faire quelque chose à ce sujet.
Recommended Posts