Maison > développement back-end > Golang > le corps du texte

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

王林
Libérer: 2024-02-08 23:33:19
avant
690 Les gens l'ont consulté

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()
}
Copier après la connexion

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()
}
Copier après la connexion

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)
    }
}
Copier après la connexion
  • 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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!