Maison  >  Article  >  développement back-end  >  Comment résoudre le blocage (en attente du signal d'un test échoué)

Comment résoudre le blocage (en attente du signal d'un test échoué)

王林
王林avant
2024-02-08 23:33:19710parcourir

Comment résoudre le blocage (en attente du signal dun test échoué)

L'éditeur php Xiaoxin vous présentera comment résoudre le problème de blocage. Le blocage est un problème courant dans la programmation simultanée. Un blocage se produit lorsque deux processus ou plus s'attendent pour libérer des ressources. Afin de résoudre ce problème, nous pouvons utiliser certaines méthodes courantes, telles que l'utilisation de verrous mutex, éviter la concurrence entre les ressources, utiliser des mécanismes de délai d'attente, etc. Grâce à une conception et à des ajustements raisonnables, nous pouvons efficacement éviter les blocages et améliorer la concurrence et la stabilité du programme. Examinons ensuite de plus près comment résoudre le problème de blocage !

Contenu de la question

J'ai deux goroutines qui sont deux fonctions testxxx pendant les tests. J'utilise des variables de condition pour synchroniser ces goroutines. Cependant, dès que l’un des tests échoue, l’autre attend un signal. L’impasse approche. De plus, si testfunctionb échoue, je souhaite que testfunctiona échoue également.

var cond sync.cond
func testfunctiona(t *testing.t){
   // ... some codes...
   cond.wait()
}
func testfunctionb(t *testing.t){
   // ... some codes...
   t.fail()
   // ... some codes...
   cond.broadcast()
}

J'ai essayé certaines méthodes, telles que :

var cond sync.Cond
var A_t *testing.T
func TestFunctionA(t *testing.T){
   // ... Some codes...
   A_t = t
   // ... Some codes...
   cond.Wait()
}
func TestFunctionB(t *testing.T){
   // ... Some codes...
   t.Cleanup(func(){
      if !A_t.Failed(){
          A_t.Fail()
      }
      cond.Broadcast()
   })
   t.Fail()
   // ... Some codes...
   cond.Broadcast()
}

Mais lorsque la fonctionb n'a aucune erreur, a_t.fail() sera toujours déclenchée.

J'envisage également d'utiliser context.context(). Cependant, je ne sais pas comment exécuter la fonction de test dans le contexte. Merci d'avoir lu ma question! J'apprécie tout commentaire ou discussion!

Solution de contournement

Un test ne doit pas interagir avec un autre test. Cependant, lorsque vous utilisez subtests, nous pouvons partager n'importe quoi entre les cas de test.

Voici un exemple :

package main

import (
    "errors"
    "testing"
)

func TestFruits(t *testing.T) {
    var err error
    t.Run("test apple", getTestAppleFunc(&err))
    t.Run("test banana", getTestBananaFunc(&err))
}

func handleError(t *testing.T, err *error) {
    if err != nil && *err != nil {
        t.Error(*err)
    }
}

func getTestAppleFunc(err *error) func(*testing.T) {
    return func(t *testing.T) {
        handleError(t, err)
        *err = errors.New("Apple failed")
    }
}

func getTestBananaFunc(err *error) func(*testing.T) {
    return func(t *testing.T) {
        handleError(t, err)
    }
}
  • Dans la fonction gettestbananafuncgettestapplefunc le pointeur d'erreur est passé en paramètre.
  • Dans l'exemple ci-dessus, la première chose à exécuter est gettestapplefunc.
  • Si l'affectation dans gettestapplefunc 中赋值错误(如上例所示),则 gettestbananafunc est erronée (comme dans l'exemple ci-dessus), la fonction gettestbananafunc échouera.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer