Multithreading goroutine或多线程在golang中不起作用

Multithreading goroutine或多线程在golang中不起作用,multithreading,go,concurrency,goroutine,Multithreading,Go,Concurrency,Goroutine,我试图在golang中实现多线程。我能够执行go例程,但它没有按预期工作。下面是我准备的示例程序 func test(s string, fo *os.File) { var s1 [105]int count :=0 for x :=1000; x<1101;x++ { s1[count] = x; count++ } //fmt.Println(s1[0]) for i := range s1 {

我试图在golang中实现多线程。我能够执行go例程,但它没有按预期工作。下面是我准备的示例程序

func test(s string, fo *os.File) {
    var s1 [105]int
    count :=0
    for x :=1000; x<1101;x++ {
    s1[count] = x;
        count++
    }

    //fmt.Println(s1[0])
    for i := range s1 {
        runtime.Gosched() 
        sd := s + strconv.Itoa(i)
        var fileMutex sync.Mutex
        fileMutex.Lock()
        fmt.Fprintf(fo,sd)
        defer fileMutex.Unlock()
    }
}

func main() {
    fo,err :=os.Create("D:/Output.txt")
    if err != nil {
        panic(err)
    }
    for i := 0; i < 4; i++ {
        go test("bye",fo) 

    }



}
func测试(s字符串,fo*os.File){
变量s1[105]int
计数:=0

对于x:=1000;x首先,您需要在主函数中阻塞,直到所有其他goroutine返回。程序中的互斥体不会阻塞任何内容,而且由于它们在每个循环中都进行了初始化,它们甚至不会在自己的goroutine中阻塞。如果不从函数返回,则不能延迟解锁,您需要显式解锁在循环的每次迭代中。您没有使用数组中的任何值(尽管您应该使用切片),因此我们可以完全删除该值。您也不需要在行为良好的程序中使用
runtime.GoSched
,在这里它什么也不做

运行到完成的等效程序如下所示:

var wg sync.WaitGroup

var fileMutex sync.Mutex

func test(s string, fo *os.File) {
    defer wg.Done()
    for i := 0; i < 105; i++ {
        fileMutex.Lock()
        fmt.Fprintf(fo, "%s%d", s, i)
        fileMutex.Unlock()
    }
}

func main() {
    fo, err := os.Create("D:/output.txt")
    if err != nil {
        log.Fatal(err)
    }
    for i := 0; i < 4; i++ {
        wg.Add(1)
        go test("bye", fo)

    }
    wg.Wait()
}
var wg sync.WaitGroup
var fileMutex sync.Mutex
func测试(s字符串,fo*os.File){
推迟工作组完成()
对于i:=0;i<105;i++{
fileMutex.Lock()
fmt.Fprintf(fo,“%s%d”,s,i)
fileMutex.Unlock()
}
}
func main(){
fo,err:=os.Create(“D:/output.txt”)
如果错误!=零{
log.Fatal(错误)
}
对于i:=0;i<4;i++{
工作组.添加(1)
进行测试(“再见”,fo)
}
wg.Wait()
}

最后,没有理由尝试从多个goroutine向单个文件写入串行值,这样做效率较低。如果要在整个文件中对值进行排序,则仍需要使用单个goroutine。

没有任何东西阻止主函数。程序在看到所有输出之前退出。@JimB感谢您的回复。但是它正在写入文件并正常工作。除了main中缺少阻塞(您需要首先修复),互斥锁没有锁定任何东西,因为它们不是在goroutine之间共享的,而且每个循环都有一个单独的互斥锁初始化,因此它甚至不会在goroutine中阻塞。当您不返回时,您可以调用defer来解锁锁。您应该永远不需要在行为良好的程序中调用
runtime.GoSched
。@JimB再次感谢谢谢你的宝贵意见。明白你的意思了。但是你能纠正我的程序吗?这样我可以创建5个线程,每个线程都会打印不同的值。这对我会有很大的帮助。我是站在我这边做的,但我不明白。请帮我解决。非常感谢你的合作。我会尝试实现它。我希望它是创造性的G5线程,每个线程都打印不同的值。顺便问一下,这是在GoLang中实现多线程的正确方法,还是有其他简单的方法可以实现这一点?Go不公开OS线程,所以是的,您使用goroutines进行并发。明白了。但我仍然无法在这里实现并行。在上面的示例中,我是一个接一个地锁定和处理数据。我想并行处理所有线程。你知道我该怎么做吗?例如,如果有集合,想从服务或数据库中获取数据,我该怎么做?@user2768132:我不知道你的意思。每个goroutine都是并发运行的,可能是在多个线程上并行调度的ds,锁定仅围绕共享文件写入。查询数据库是完全无关的。感谢您的回复。实际上,我正在尝试在写入文件之前点击服务url。点击url后,我正在向文件写入响应。如果我看到当前示例,我认为它没有并行运行由于锁定。首先它是锁定并写入文件。到那时,所有其他线程都在等待。我说的对吗?请指导我。