ሓደ ካብቲ ናይ ጎ ፊርማ ባህርያት፡ ንተመሳሳሊ ምትእስሳር ዝኸውን ኣብ ውሽጡ ዝተሃንጸ ደገፍ እዩ። ጎሩቲንን ቻነላትን ንተመሳሳሊ መደባት ንምጽሓፍ ቀለልትን ውጽኢታውያንን ቀዳሞት እዮም።
ይኹን እምበር፡ ንተመሳሳሊ መደባት ምፍታን ከቢድን ንጌጋታት ዝቃላዕን ክኸውን ይኽእል።
ኣብ Go 1.24፡ ንፈተነ ተጓናጺ ኮድ ዝድግፍ ሓድሽ፡ ፈተነኣዊ testing/synctest
ፓኬጅ ነተኣታቱ ኣለና። እዚ ጽሑፍ እዚ ነዚ ፈተነ ዝደረኾ ድርኺት ዝገልጽ፡ ከመይ ጌርካ ነቲ synctest package ከም እትጥቀመሉ ዘርኢ፡ ከምኡ’ውን ብዛዕባ መጻኢኡ ክዛተየሉ እዩ።
ኣብ Go 1.24 እቲ testing/synctest
ፓኬጅ ፈተነ ዝግበረሉ ኮይኑ ናይ Go ምትእስሳር መብጽዓ ኣይግዛእን እዩ። ብነባሪ መልክዑ ኣይርአን እዩ። ንዕኡ ንምጥቃም፡ ኮድካ ምስ GOEXPERIMENT=synctest
ኣብ ከባቢኻ ተሰሪዑ ኣጠቓልል።
ተደጋጋሚ መደባት ምፍታን ከቢድ እዩ።
ንመጀመርታ ግዜ፡ ሓደ ቀሊል ኣብነት እስከ ንርአ።
እቲ context.AfterFunc
ፋንክሽን ድሕሪ ሓደ ዓውደ-ጽሑፍ ምስተሰረዘ ሓደ ፋንክሽን ኣብ ናይ ገዛእ ርእሱ goroutine ክጽዋዕ የዳሉ። AfterFunc
ክኸውን ዝኽእል ፈተና ኣብዚ ኣሎ :
func TestAfterFunc(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) calledCh := make(chan struct{}) // closed when AfterFunc is called context.AfterFunc(ctx, func() { close(calledCh) }) // TODO: Assert that the AfterFunc has not been called. cancel() // TODO: Assert that the AfterFunc has been called. }
ኣብዚ ፈተና ክልተ ኩነታት ክንፍትሽ ንደሊ፡ እቲ ፋንክሽን ቅድሚ እቲ ዓውደ-ጽሑፍ ምስራዙ ኣይጽዋዕን፡ እቲ ፋንክሽን ድማ ድሕሪ እቲ ዓውደ-ጽሑፍ ምስራዙ ይጽዋዕ ።
ኣብ ተጓናጺ ስርዓት ኣሉታዊ ምፍታሽ ኣጸጋሚ እዩ። እቲ ፋንክሽን ገና ከምዘይተጸውዐ ብቐሊሉ ክንፍትኖ ንኽእል ኢና , ግን ከመይ ጌርና ከምዘይጽዋዕ ንምርግጋጽ?
ልሙድ ኣገባብ፡ ሓደ ፍጻመ ከምዘይፍጸም ቅድሚ ምድምዳምካ፡ ንዝተወሰነ ግዜ ምጽባይ እዩ። ነዚ ዝገብር ኣብ ፈተናና ሓጋዚ ፋንክሽን ከነተኣታቱ ንፈትን።
// funcCalled reports whether the function was called. funcCalled := func() bool { select { case <-calledCh: return true case <-time.After(10 * time.Millisecond): return false } } if funcCalled() { t.Fatalf("AfterFunc function called before context is canceled") } cancel() if !funcCalled() { t.Fatalf("AfterFunc function not called after context is canceled") }
እዚ ፈተና ቀስ ዝበለ እዩ: 10 ሚሊሰከንድ ብዙሕ ግዜ ኣይኮነን: ግን ኣብ ልዕሊ ብዙሕ ፈተናታት ይድመር።
እዚ ፈተና እዚ ውን ፍላኪ እዩ: 10 ሚሊሰከንድ ኣብ ቅልጡፍ ኮምፒተር ነዊሕ ግዜ እዩ፣ ኣብ ዝተኻፈለን ልዕሊ ዓቐን ዝተጻዕነን CI ስርዓታት ግን ንሓያሎ ካልኢታት ዝጸንሕ ዕረፍቲ ምርኣይ ዘይተለምደ ኣይኮነን።
ነቲ ፈተና ዝሓሰረ ንምግባር ብዋጋ ውሑድ ፍላኪ ክንገብሮ ንኽእል ኢና፡ ብዋጋ ፍላኪስ ንምግባር ድማ ውሑድ ስሉጥ ክንገብሮ ንኽእል ኢና፡ ግን ቅልጡፍን ዘተኣማምንን ክንገብሮ ኣይንኽእልን ኢና።
ምልላይ ናይ ፈተነ/ምትእስሳር ፓኬጅ
እቲ testing/synctest
package ነዚ ጸገም ይፈትሖ። ነዚ ፈተና ቀሊልን ቅልጡፍን ዘተኣማምንን ክኸውን ዳግማይ ክንጽሕፎ የኽእለና፣ ኣብቲ ዝፍተን ኮድ ዝኾነ ለውጢ ከይገበርና።
እቲ ፓኬጅ ክልተ ተግባራት ጥራይ እዩ ዝሓዘ Run
and Wait
።
Run
ኣብ ሓድሽ goroutine ንሓደ ፋንክሽን ይጽውዕ። እዚ ጎሮቲንን ዝኾነ ብእኡ ዝጅምር ጎሮቲንን ኣብ ዝተነጸለ ሃዋህው ዝህሉ ኮይኑ ንሱ ድማ ፍንጣጣ ንብሎ ። Wait
ኣብቲ ናይ ሕጂ ጎሮቲን ቡምባ ዘሎ ነፍሲ ወከፍ ጎሩቲን ኣብ ካልእ ጎሮቲን ኣብቲ ቡምባ ክዓግት ይጽበ።
ኣብ ላዕሊ ዘሎ ፈተናና testing/synctest
package ተጠቒምና ዳግማይ ንጽሓፎ።
func TestAfterFunc(t *testing.T) { synctest.Run(func() { ctx, cancel := context.WithCancel(context.Background()) funcCalled := false context.AfterFunc(ctx, func() { funcCalled = true }) synctest.Wait() if funcCalled { t.Fatalf("AfterFunc function called before context is canceled") } cancel() synctest.Wait() if !funcCalled { t.Fatalf("AfterFunc function not called after context is canceled") } }) }
እዚ ዳርጋ ምስቲ ናይ መጀመርታ ፈተናና ተመሳሳሊ እዩ፣ ግን ነቲ ፈተና ኣብ synctest.Run
ጠቕሊልናዮ ኣለና።Run call and we call synctest.Wait
እቲ ፋንክሽን ከምዝተጸውዐን ከምዘይተጸውዐን ቅድሚ ምርግጋጽና ተጸበ።
እቲ Wait
ዝብል ተግባር ኣብ ቡምባ ናይቲ ደዋሊ ዘሎ ነፍሲ ወከፍ ጎሮቲን ክሳብ ዝዓግት ይጽበ። ምስ ተመልሰ፡ እቲ ናይ ዓውዲ ፓኬጅ ወይ ነቲ ፋንክሽን ከም ዝጸውዖ፡ ወይ ድማ ገለ ተወሳኺ ስጉምቲ ክሳብ ዘይንወስድ ከምዘይጽውዖ ንፈልጥ።
እዚ ፈተና ሕጂ ቅልጡፍን ዘተኣማምንን ኮይኑ ኣሎ።
እቲ ፈተና እውን ዝቐለለ እዩ: ነቲ calledCh
ቻነል ብቡልያን ተኪእናዮ ኣለና። ቅድሚ ሕጂ ኣብ መንጎ test goroutineን AfterFunc
goroutineን ናይ ዳታ ውድድር ንኸይፍጠር ቻነል ክንጥቀም የድልየና ነይሩ፡ ሕጂ ግን Wait
function ነቲ synchronization ይህብ።
እቲ ናይ ውድድር መፍለጢ ንጻውዒት Wait
ይርድኦ እዩ፣ እዚ ፈተና ድማ ምስ -race
ክጎዪ ከሎ ይሓልፍ። ካልኣይ Wait
ጻውዒት እንተኣሊናዮ፡ እቲ ናይ ውድድር ዲቴክተር ኣብቲ ፈተና ናይ ዳታ ውድድር ብትኽክል ክሕብር እዩ።
ናይ ፈተና ግዜ
መብዛሕትኡ ግዜ ተደጋጋሚ ኮድ ምስ ግዜ እዩ ዝዛረብ።
ምስ ግዜ ዝሰርሕ ኮድ ምፍታን ከቢድ ክኸውን ይኽእል እዩ። ኣብ ፈተነታት ሓቀኛ ግዜ ምጥቃም ከምቲ ኣብ ላዕሊ ዝረኣናዮ ቀስ ዝበለን ቅራፍ ዘለዎን ፈተነታት የስዕብ። ናይ ሓሶት ግዜ ምጥቃም ካብ time
ፓኬጅ ተግባራት ምውጋድ የድሊ፣ ከምኡ’ውን ነቲ ኣብ ፈተነ ዘሎ ኮድ ምስ ኣማራጺ ናይ ሓሶት ሰዓት ክሰርሕ ምህዛን የድሊ።
እቲ testing/synctest
package ግዜ ዝጥቀም ኮድ ንምፍታን ቀሊል ይገብሮ።
ኣብቲ ብ Run
ዝተጀመረ ጎሮቲናት ናይ ሓሶት ሰዓት ይጥቀሙ። ኣብ ውሽጢ እቲ ቡምባ፡ ኣብቲ time
ፓኬጅ ዝርከቡ ተግባራት ኣብቲ ናይ ሓሶት ሰዓት ይሰርሑ። ኩሉ ጎሮቲን ምስ ተዓጽወ ኣብቲ ቡምባ ግዜ ይግስግስ።
ንምርኣይ፡ ን context.WithTimeout
function ዝኸውን ፈተና ንጽሓፍ። WithTimeout
ውላድ ናይ ሓደ ዓውደ-ጽሑፍ ይፈጥር፣ እዚ ድማ ድሕሪ ዝተዋህበ ግዜ ምውዳእ ግዜኡ የብቅዕ።
func TestWithTimeout(t *testing.T) { synctest.Run(func() { const timeout = 5 * time.Second ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() // Wait just less than the timeout. time.Sleep(timeout - time.Nanosecond) synctest.Wait() if err := ctx.Err(); err != nil { t.Fatalf("before timeout, ctx.Err() = %v; want nil", err) } // Wait the rest of the way until the timeout. time.Sleep(time.Nanosecond) synctest.Wait() if err := ctx.Err(); err != context.DeadlineExceeded { t.Fatalf("after timeout, ctx.Err() = %v; want DeadlineExceeded", err) } }) }
ነዚ ፈተና ልክዕ ምስ ሓቀኛ ግዜ ንሰርሕ ከም ዘለና ጌርና ኢና ንጽሕፎ። እቲ እንኮ ፍልልይ ነቲ ናይ ፈተነ ተግባር ኣብ synctest.Run
ንጠቕልሎ ፣ ድሕሪ ነፍሲ ወከፍ time.Sleep
ድማ synctest.Wait
ንጽውዖ።ናይ ዓውደ-ጽሑፍ ፓኬጅ ታይመርስ ምጉያይ ክውድኡ ንጽበ ጻውዒት ድቃስ።
ምዕጋትን ምፍንጫልን
ኣብ testing/synctest
ቁልፊ ኣምር እቲ ፍንጣጣ ብነባሪ መንገዲ ምዕጻው እዩ ። እዚ ዝኸውን ኣብቲ ቡምባ ዘሎ ነፍሲ ወከፍ ጎሮቲን ምስ ዝዕጾ፣ ኣብቲ ቡምባ ብኻልእ ጎሮቲን ጥራይ ክፍታሕ ዝኽእል።
ሓደ ፍንጣጣ ብነዊሕ እዋን ምስ ዝዕጾ፤
- ዘይተኸፍለ
Wait
ጻውዒት እንተሃልዩ ይምለስ። - እንተዘይኮይኑ ግዜ ናብቲ ንሓደ ጎሮቲን እንተሃልዩ ክፈትሖ ዝኽእል ዝቕጽል ግዜ ይሰጋገር።
- እንተዘይኮይኑ እቲ ዕንፍሩር ዕጽው ኮይኑ ሩን ስንባደ
Run
።
ሓደ ፍንጣጣ ዝኾነ ጎሩቲን እንተተዓጽዩ ብነዊሕ እዋን ኣይዕገትን ግን ካብ ደገ እቲ ፍንጣጣ ብገለ ፍጻመ ክበራበር ይኽእል።
ምሉእ ዝርዝር ናይቶም ንሓደ ጎሮቲን ብነዊሕ እዋን ዝዓግቱ ስርሒታት፤
- a send ወይ receive ኣብ nil ቻነል
- ኣብ ውሽጢ ሓደ ቡምባ ኣብ ዝተፈጥረ ቻነል ዝተዓጽወ ምልኣኽ ወይ ምቕባል
- ነፍሲ ወከፍ ጉዳይ ብነባሪ መንገዲ ዝዓግተሉ ምሩጽ መግለጺ
-
time.Sleep
-
sync.Cond.Wait
-
sync.WaitGroup.Wait
ሙቴክስ ዝበሃሉ።
ኣብ sync.Mutex
ዝግበር ስርሒታት ብነባሪ ዝዓግት ኣይኮነን።
ፋንክሽን ዓለማዊ ሙቴክስ ምጥራይ ልሙድ እዩ። ንኣብነት ኣብቲ reflect package ዝርከቡ ብርክት ዝበሉ ተግባራት ብmutex ዝሕሎ ዓለማዊ ካሸ ይጥቀሙ። ኣብ ሲንክተስት ቡምባ ዝርከብ ጎሩቲን ካብቲ ቡምባ ወጻኢ ብጎሩቲን ዝተታሕዘ ሙቴክስ እናረኸበ ከሎ እንተዓጊቱ፡ ንነዊሕ እዋን ኣይዕገትን እዩ-ተዓጽዩ እዩ፡ ግን ካብ ቡምባ ወጻኢ ብዝመጽእ ጎሩቲን ክፍታሕ እዩ።
መብዛሕትኡ ግዜ ሙቴክስ ንነዊሕ እዋን ስለዘይሕዙ፡ ካብ testing/synctest
's consideration ጥራይ ኢና ነግልሎም።
ቻነላት
ኣብ ውሽጢ ዕንፍሩር ዝፍጠሩ ቻነላት ካብቶም ኣብ ደገ ዝተፈጥሩ ዝተፈለየ ባህሪ ኣለዎም።
ስርሓት ቻነል ብነባሪ ዝዕገት እቲ ቻነል ቡምባ (ኣብቲ ቡምባ ዝተፈጥረ) ምስ ዝኸውን ጥራይ እዩ። ካብ ደገ ቡምባ ኣብ ቡምባ ዘለዎ ቻነል ምስራሕ ስንባደ ይፈጥር።
እዞም ሕግታት እዚኦም ሓደ ጎሮቲን ኣብ ውሽጢ ፍንጣጣኡ ምስ ጎሮቲን ኣብ ዝረዳድኣሉ እዋን ጥራይ ብነባሪ መንገዲ ከም ዝዕገት የረጋግጹ።
I/O
ከም ካብ ምትእስሳር መርበብ ምንባብ ዝኣመሰሉ ናይ ደገ I/O ስርሓት ንነዊሕ እዋን ዝዓግቱ ኣይኮኑን።
ኔትወርክ ንባባት ካብ ደገ ቡምባ ብዝመጹ ጽሑፋት ክኽፈቱ ይኽእሉ እዮም፣ ምናልባት እውን ካብ ካልእ መስርሓት። ዋላ እቲ እንኮ ጸሓፊ ናብ ምትእስሳር መርበብ እውን ኣብ ሓደ ዓይነት ዕንፍሩር እንተሃለወ፡ እቲ ናይ ምዝዋር ግዜ ኣብ መንጎ ተወሳኺ ዳታ ክመጽእ ዝጽበ ምትእስሳርን እቲ ከርነል ዳታ ዝተቐበለሉን ኣብ መስርሕ ምብጻሕ ዝርከብን ርክብ ክፈሊ ኣይክእልን።
ንሓደ ኔትወርክ ሰርቨር ወይ ዓሚል ብ synctest ምፍታን ብሓፈሻ ናይ ሓሶት ኔትወርክ ኣተገባብራ ምቕራብ ከድሊ እዩ። ንኣብነት net.Pipe
ፋንክሽን ኣብ ውሽጢ ዝኽሪ ኔትወርክ ምትእስሳር ዝጥቀሙን ኣብ synctest tests ክጥቀሙ ዝኽእሉን ጽምዲ net.Conn
s ይፈጥር።
ዕድመ ቡምባ
እቲ Run
ዝብል ፋንክሽን ኣብ ሓድሽ ቡምባ ሓደ goroutine ይጅምር። ኣብቲ ቡምባ ዘሎ ኩሉ ጎሩቲን ምስ ወጸ እዩ ዝምለስ። እቲ ዕንፍሩር ንነዊሕ እዋን እንተተዓጽዩን ብግዜ እናገስገሰ ክኽፈት እንተዘይክኢሉን ይስንብድ።
ነፍሲ ወከፍ ኣብቲ ቡምባ ዘሎ ጎሮቲን ቅድሚ ሩን ምምላሱ ክወጽእ ዝብል ጠለብ፡ ፈተነታት ቅድሚ ምዝዛሞም ዝኾነ ድሕረ ባይታ ጎሮቲን ንምጽራይ ክጥንቀቑ ኣለዎም ማለት እዩ።
ኔትወርክ ዘለዎ ኮድ ምፍታን
ካልእ ኣብነት ንርአ፡ ኣብዚ ግዜ እዚ testing/synctest
package ተጠቒምና ንሓደ ኔትወርክ ዘለዎ ፕሮግራም ንፈትኖ። ነዚ ኣብነት እዚ፡ እቲ net/http
package ዘለዎ ኣተሓሕዛ ናይቲ 100 Continue ዝብል መልሲ ክንፍትኖ ኢና።
ሓደ ሕቶ ዝልእኽ ዓሚል ኤችቲቲፒ፡ እቲ ዓሚል ክሰዶ ተወሳኺ ዳታ ከም ዘለዎ ነቲ ኣገልጋሊ ንምንጋር “ተጸበዮ: 100-ይቕጽል” ዝብል ርእሲ ከጠቓልል ይኽእል። ብድሕሪኡ እቲ ኣገልጋሊ ንዝተረፈ ሕቶ ንምሕታት ብ100 Continue ሓበሬታዊ መልሲ ክምልስ ይኽእል፣ ወይ ድማ ብገለ ካልእ ኩነታት ነቲ ዓሚል እቲ ትሕዝቶ ከምዘየድሊ ክነግሮ ይኽእል። ንኣብነት ሓደ ዓቢ ፋይል ዝሰቕል ዓሚል ነዚ ባህሪ ተጠቒሙ እቲ ኣገልጋሊ ነቲ ፋይል ቅድሚ ምልኣኹ ክቕበሎ ፍቓደኛ ምዃኑ ከረጋግጽ ይኽእል።
ፈተናና “ተጸበዩ: 100-ቀጽል” ዝብል ርእሲ ክሰድድ ከሎ እቲ ዓሚል HTTP ቅድሚ እቲ ኣገልጋሊ ምሕታቱ ትሕዝቶ ናይ ሓደ ሕቶ ከምዘይሰድድ፣ ከምኡ’ውን 100 ቀጽል ዝብል መልሲ ምስ ረኸበ ነቲ ትሕዝቶ ከም ዝልእኾ ከረጋግጽ እዩ።
መብዛሕትኡ ግዜ ፈተነታት ናይ ሓደ ርክብ ዝገብር ዓሚልን ኣገልጋልን ሉፕባክ መርበብ ምትእስሳር ክጥቀም ይኽእል። ምስ testing/synctest
ክንሰርሕ ከለና ግን መብዛሕትኡ ግዜ ኩሎም ጎሩቲናት ኣብቲ መርበብ ምስ ተዓጽዉ ንኽንፈልጥ ዘኽእለና ናይ ሓሶት መርበብ ምትእስሳር ክንጥቀም ክንደሊ ኢና። ነዚ ፈተና ብ net.Pipe
ዝተፈጥረ ናይ ውሽጢ መዘክር መርበብ ምትእስሳር ዝጥቀም http.Transport
(HTTP client) ብምፍጣር ክንጅምሮ ኢና።
func Test(t *testing.T) { synctest.Run(func() { srvConn, cliConn := net.Pipe() defer srvConn.Close() defer cliConn.Close() tr := &http.Transport{ DialContext: func(ctx context.Context, network, address string) (net.Conn, error) { return cliConn, nil }, // Setting a non-zero timeout enables "Expect: 100-continue" handling. // Since the following test does not sleep, // we will never encounter this timeout, // even if the test takes a long time to run on a slow machine. ExpectContinueTimeout: 5 * time.Second, }
ኣብዚ መጓዓዝያ እዚ “ተጸበዮ: 100-ቀጽል” ዝብል ርእሲ ስብስብ ሒዝና ሕቶ ንሰድድ። እቲ ሕቶ ክሳብ መወዳእታ እቲ ፈተና ስለዘይውዳእ ብሓድሽ ጎሮቲን ይለኣኽ።
body := "request body" go func() { req, _ := http.NewRequest("PUT", "http://test.tld/", strings.NewReader(body)) req.Header.Set("Expect", "100-continue") resp, err := tr.RoundTrip(req) if err != nil { t.Errorf("RoundTrip: unexpected error %v", err) } else { resp.Body.Close() } }()
እቲ ዓሚል ዝለኣኾ ርእሲ ሕቶታት ነንብብ።
req, err := http.ReadRequest(bufio.NewReader(srvConn)) if err != nil { t.Fatalf("ReadRequest: %v", err) }
ሕጂ ናብ ልቢ ፈተና ንመጽእ ኣለና። ዓሚል ገና ነቲ ናይ ሕቶ ኣካል ከምዘይሰዶ ከነረጋግጽ ንደሊ።
ነቲ ናብ ሰርቨር ዝተላእከ ኣካል ናብ strings.Builder
ብምቕዳሕ ሓድሽ goroutine ንጅምር፣ ኩሎም ኣብቲ bubble ዘለዉ goroutines ክሳብ ዝዓግቱ ንጽበ፣ ካብቲ ኣካል ገና ዝኾነ ነገር ከምዘየንበብና ነረጋግጽ።
synctest.Wait
call እንተረሲዕናዮ፡ እቲ race detector ብትኽክል ብዛዕባ data race ከማርር እዩ፡ ምስቲ Wait
ግን እዚ ውሑስ እዩ።
var gotBody strings.Builder go io.Copy(&gotBody, req.Body) synctest.Wait() if got := gotBody.String(); got != "" { t.Fatalf("before sending 100 Continue, unexpectedly read body: %q", got) }
ንዓሚል “100 Continue” ዝብል መልሲ ንጽሕፍ እሞ ሕጂ ነቲ ናይ ሕቶ ኣካል ከም ዝልእኾ ነረጋግጽ።
srvConn.Write([]byte("HTTP/1.1 100 Continue\r\n\r\n")) synctest.Wait() if got := gotBody.String(); got != body { t.Fatalf("after sending 100 Continue, read body %q, want %q", got, body) }
ኣብ መወዳእታ ድማ ነቲ ሕቶ ንምዝዛም “200 OK” ዝብል መልሲ ብምልኣኽ ንውድኦ።
ኣብዚ ፈተና ሓያሎ ጎሩቲናት ጀሚርና ኣለና። እቲ synctest.Run
ዝብል ጻውዒት ቅድሚ ምምላሱ ኩሎም ክወጹ ክጽበ እዩ።
srvConn.Write([]byte("HTTP/1.1 200 OK\r\n\r\n")) }) }
እዚ ፈተና እዚ ንኻልኦት ባህርያት ንምፍታን ብቐሊሉ ክዝርጋሕ ይኽእል እዩ፣ ከም እቲ ኣገልጋሊ እንተዘይሓቲቱ እቲ ናይ ሕቶ ኣካል ከምዘይለኣኽ ምርግጋጽ፣ ወይ ድማ እቲ ኣገልጋሊ ኣብ ውሽጢ ግዜ ምቁራጽ መልሲ እንተዘይሂቡ ከምዝለኣኽ ምርግጋጽ።
ኩነታት ናይቲ ፈተነ
ኣብ Go 1.24 testing/synctest
ከም ፈተነ ፓኬጅ ነተኣታቱ ኣለና። ከከም ግብረ መልስን ተመኩሮን ምስ ምምሕያሻት ይኹን ብዘይ ምምሕያሽ ክንዝርግሖ ንኽእል ኢና፣ ነቲ ፈተነ ክንቅጽሎ ንኽእል ኢና፣ ወይ ድማ ኣብ መጻኢ ስሪት ናይ Go ከነወግዶ ንኽእል ኢና።
እቲ ፓኬጅ ብነባሪ ኣይርአን እዩ። ንዕኡ ንምጥቃም፡ ኮድካ ምስ GOEXPERIMENT=synctest
ኣብ ከባቢኻ ተሰሪዑ ኣጠቓልል።
ርእይቶኹም ክንሰምዕ ንደሊ! testing/synctest
እንተፈቲንኩም፡ በጃኹም ተመኩሮታትኩም፡ ኣወንታዊ ይኹን ኣሉታዊ፡ ኣብ go.dev/issue/67434 ጸብጻብ ኣቕርቡ።
ስእሊ ፡ ዳሚን ኒል
ስእሊ ብጋብሪኤል ጉስማኦ ኣብ ኣንስፕላሽ
እዚ ጽሑፍ ኣብ...