Multithreading goroutine的变量没有时间注册

Multithreading goroutine的变量没有时间注册,multithreading,go,parallel-processing,Multithreading,Go,Parallel Processing,这段代码获取一个带有字符串的数组,应该将其混合并做出响应(都是多线程的)。 问题是答案的文本被随机剪切。这可能是因为变量“dump”没有时间完全注册。如果它被包装在互斥锁中,则返回完整的文本,但线程被阻塞,程序被执行很长时间。请帮忙 const url = "https://yandex.ru/referats/write/?t=astronomy+mathematics" const parseThreadsNum = 10 const generateThreadsNum = 1000 f

这段代码获取一个带有字符串的数组,应该将其混合并做出响应(都是多线程的)。 问题是答案的文本被随机剪切。这可能是因为变量“dump”没有时间完全注册。如果它被包装在互斥锁中,则返回完整的文本,但线程被阻塞,程序被执行很长时间。请帮忙

const url = "https://yandex.ru/referats/write/?t=astronomy+mathematics"
const parseThreadsNum = 10
const generateThreadsNum = 1000

func startServer(wg *sync.WaitGroup) {
fmt.Println("Server started")
ch := make(chan []byte, generateThreadsNum)

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    wg.Add(generateThreadsNum)
    rawText := multiparseText() // text parsing
    prettyText := prettifyText(rawText) // truncates commas, dots etc. Return []string
    for i := 0; i < generateThreadsNum; i++ {
        go func() {
            dump, _ := json.Marshal(shuffle(&prettyText)) //shuffle mixes array randomly
            ch <- dump
        }()
        go func() {
            w.Write(<-ch)
            defer wg.Done()
        }()
    }
    fmt.Println("Text generated")
    wg.Wait()
})
log.Fatal(http.ListenAndServe(":8081", nil))
}

func main() {
var wg sync.WaitGroup
runtime.GOMAXPROCS(runtime.NumCPU())
startServer(&wg)

}
consturl=”https://yandex.ru/referats/write/?t=astronomy+“数学”
常量parseThreadsNum=10
const generateThreadsNum=1000
func startServer(wg*sync.WaitGroup){
fmt.Println(“服务器已启动”)
ch:=make(chan[]字节,generateThreadsNum)
http.HandleFunc(“/”,func(w http.ResponseWriter,r*http.Request){
工作组添加(generateThreadsNum)
rawText:=multipassetext()//文本解析
prettyText:=prettiByText(rawText)//截断逗号、点等。返回[]字符串
对于i:=0;ich Three没有理由在goroutine中调用
w.Write
——所有写入操作都将指向同一个连接,因此它们无论如何都必须是顺序的。您正在将
generateThreadsum
添加到WaitGroup中,但调用的
gorotines
和调用
Done()的次数是原来的2倍
只有一半..我不确定这是否是你问题的原因谢谢!是的,这是个错误,我完全忘记了。但这与问题无关。每个请求都需要自己的通道&waitGroup,你不能在处理程序的调用中共享它们。三个没有理由在goroutine中调用
w.Write
,即wr所有站点都将连接到同一个连接,因此它们无论如何都必须是顺序的。您正在将
generatethreadsum
添加到WaitGroup中,但调用的
gorotines
的2倍,并调用
Done()
只有一半。我不确定这是否是问题的原因谢谢!是的,这是一个错误,我完全忘记了。但这与问题无关。每个请求都需要自己的通道和waitGroup,您不能在处理程序的调用中共享它们。