Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyelesaikan kebuntuan (menunggu isyarat ujian gagal)

Bagaimana untuk menyelesaikan kebuntuan (menunggu isyarat ujian gagal)

王林
王林ke hadapan
2024-02-08 23:33:19703semak imbas

Bagaimana untuk menyelesaikan kebuntuan (menunggu isyarat ujian gagal)

editor php Xiaoxin akan memperkenalkan kepada anda cara menyelesaikan masalah kebuntuan. Kebuntuan ialah masalah biasa dalam pengaturcaraan serentak berlaku apabila dua atau lebih proses menunggu satu sama lain untuk melepaskan sumber. Untuk menyelesaikan masalah ini, kita boleh menggunakan beberapa kaedah biasa, seperti menggunakan kunci mutex, mengelakkan persaingan sumber, menggunakan mekanisme tamat masa, dsb. Melalui reka bentuk dan pelarasan yang munasabah, kami boleh mengelakkan berlakunya kebuntuan dengan berkesan dan meningkatkan keselarasan dan kestabilan program. Seterusnya, mari kita lihat dengan lebih dekat cara menyelesaikan masalah kebuntuan!

Kandungan soalan

Saya mempunyai dua goroutine yang merupakan dua fungsi testxxx semasa ujian. Saya menggunakan pembolehubah keadaan untuk menyegerakkan goroutine ini. Walau bagaimanapun, apabila salah satu daripada ujian gagal, yang lain sedang menunggu isyarat. Kebuntuan akan datang. Juga, jika testfunctionb gagal, saya mahu testfunctiona juga gagal.

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()
}

Saya telah mencuba beberapa kaedah, seperti:

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()
}

Tetapi apabila functionb tiada ralat, a_t.fail() masih akan dicetuskan.

Saya juga sedang mempertimbangkan untuk menggunakan context.context(). Walau bagaimanapun, saya tidak tahu cara menjalankan fungsi ujian dalam konteks. Terima kasih kerana membaca soalan saya! Saya menghargai sebarang komen atau perbincangan!

Penyelesaian

Satu ujian tidak sepatutnya berinteraksi dengan ujian lain. Walau bagaimanapun, apabila menggunakan subtests kita boleh berkongsi apa sahaja antara kes ujian.

Ini contohnya:

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)
    }
}
  • Dalam fungsi gettestbananafuncgettestapplefunc penunjuk ralat diluluskan sebagai parameter.
  • Dalam contoh di atas, perkara pertama yang akan dilaksanakan ialah gettestapplefunc.
  • Jika tugasan dalam gettestapplefunc 中赋值错误(如上例所示),则 gettestbananafunc salah (seperti dalam contoh di atas), fungsi gettestbananafunc akan gagal.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan kebuntuan (menunggu isyarat ujian gagal). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Operasi median Mongo di GolangArtikel seterusnya:Operasi median Mongo di Golang