저는 golang을 처음 사용하기 때문에 numeber-range와 character-range의 요소를 결합한 10 개의 영숫자를 인쇄하고 싶습니다.동시에 알파벳과 숫자 인쇄시 교착 상태를 피하는 방법
동시에 처리하기로 결정했지만 교착 상태 관련 오류가 발생했습니다.
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
type alphanumeric struct {
anAlphabet string
aNumber string
}
func (someStruct alphanumeric) pairAlphanumeric() string {
return someStruct.aNumber + someStruct.anAlphabet
}
func main() {
var wg sync.WaitGroup
numbers := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}
alphabets := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
//var aleph alphanumeric
//var alephS []alphanumeric
wg.Add(len(alphabets))
go func(numbers []string, alphabets []string) {
defer wg.Done()
for i := 0; i < 10; i++ {
makeAleph(numbers, alphabets)
}
}(numbers, alphabets)
wg.Wait()
} // end of main()
func makeAleph(numbers []string, alphabets []string) {
var aleph alphanumeric
aleph.anAlphabet = aNum(numbers)
aleph.aNumber = anAlph(alphabets)
fmt.Println(aleph.pairAlphanumeric())
//return aleph.pairAlphanumeric()
}
func randomIndex() int {
randTime := time.Time.UnixNano(time.Now())
rand.Seed(randTime)
return rand.Intn(10)
}
func aNum(numbers []string) string {
return numbers[randomIndex()]
}
func anAlph(alphabets []string) string {
return alphabets[randomIndex()]
}
그리고 정확하게 필요한 번호를 인쇄 한 후 발생이라는 오류 :
❯ go run aleph.go
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc42000e2dc)
/Users/eklavya/.gvm/gos/go1.8/src/runtime/sema.go:47 +0x34
sync.(*WaitGroup).Wait(0xc42000e2d0)
/Users/eklavya/.gvm/gos/go1.8/src/sync/waitgroup.go:131 +0x7a
main.main()
/Users/eklavya/Projects/Polyglot/TedTalks/goTED/experiments/async/aleph.go:38 +0x14c
goroutine 5 [chan receive (nil chan)]:
main.makeAleph(0xc420084000, 0xa, 0xa, 0xc420001520, 0x1a, 0x1a)
/Users/eklavya/Projects/Polyglot/TedTalks/goTED/experiments/async/aleph.go:61 +0x134
main.main.func1(0xc42000e2d0, 0xc420084000, 0xa, 0xa, 0xc420001520, 0x1a, 0x1a)
/Users/eklavya/Projects/Polyglot/TedTalks/goTED/experiments/async/aleph.go:35 +0x94
created by main.main
/Users/eklavya/Projects/Polyglot/TedTalks/goTED/experiments/async/aleph.go:37 +0x13e
goroutine 6 [chan send (nil chan)]:
main.aNum(0x0, 0xc420084000, 0xa, 0xa)
/Users/eklavya/Projects/Polyglot/TedTalks/goTED/experiments/async/aleph.go:79 +0x5b
main.makeAleph.func1(0xc42000e2e0, 0x0, 0xc420084000, 0xa, 0xa)
/Users/eklavya/Projects/Polyglot/TedTalks/goTED/experiments/async/aleph.go:51 +0x73
created by main.makeAleph
/Users/eklavya/Projects/Polyglot/TedTalks/goTED/experiments/async/aleph.go:52 +0xad
goroutine 7 [chan send (nil chan)]:
main.anAlph(0x0, 0xc420001520, 0x1a, 0x1a)
/Users/eklavya/Projects/Polyglot/TedTalks/goTED/experiments/async/aleph.go:85 +0x5b
main.makeAleph.func2(0xc42000e2e0, 0x0, 0xc420001520, 0x1a, 0x1a)
/Users/eklavya/Projects/Polyglot/TedTalks/goTED/experiments/async/aleph.go:56 +0x73
created by main.makeAleph
/Users/eklavya/Projects/Polyglot/TedTalks/goTED/experiments/async/aleph.go:57 +0xff
exit status 2
가 어떻게 동시에 숫자 번호를 인쇄에서 교착 상태를 피할 수있다?
부수적으로, 생성 된 모든 난수에 대해'rand.Seed'를 호출하지 않아야합니다. – hobbs
@hobbs, DRY를 위반하는 것 외에도 성능에 중요한 영향을 미칩니 까? –
정확하지 않은 경우에만 성능이 저하됩니다. 그것은 귀하의 난수를 훨씬 덜 무작위로 만듭니다. – hobbs