Maison > Article > développement back-end > Comment résoudre le blocage (en attente du signal d'un 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 !
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!
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) } }
gettestbananafunc
和 gettestapplefunc
le pointeur d'erreur est passé en paramètre. gettestapplefunc
. 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!