Rumah > Artikel > pembangunan bahagian belakang > 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!
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!
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) } }
gettestbananafunc
和 gettestapplefunc
penunjuk ralat diluluskan sebagai parameter. gettestapplefunc
. 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!