[go] 我的程序中如何实现Golang多线程编程

[go] 我的程序中如何实现Golang多线程编程 今天想请大家帮忙看看这段代码。我想让应用程序实现多线程处理,该怎么做呢?以下是相关代码:

我定义了这样的结构体:

type Sre struct {
		Name     string `json:"Namesre"`
		Url      string `json:"Url"`
		P_name   string `json:"P_name"`
		P_email  string `json:"P_email"`
		Other    string `json:"Other_params"`
		Create string `json:"Create"`
		Base    string `json:"Base"`
	}

	type Settings struct {
		Sres []Sre
	}
    
    var settings Settings

假设现在有100个元素 settings.Sres[100]

在常规情况下,我会使用for循环逐个遍历所有元素。那么如何通过多线程来实现呢?

for i := 0; i < len(settings.Sres); i++ {
    go Other(settings.Sres[I].Name,
        settings.Sres[I].Url,
        settings.Sres[I].P_name,
        settings.Sres[I].P_email,
        settings.Sres[I].Other,
        settings.Sres[I].Create,
        settings.Sres[I].Base)
}
func Other{param1 string, param2 string, param3 string, param4 string, param5 string, param6 string,param7 string
{
....
....
....
}

请问如何创建100个线程来同时处理所有元素(settings.Sres[100]),让Other函数在100个线程中并行执行?


更多关于[go] 我的程序中如何实现Golang多线程编程的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

是的,我同意,现在我正在研究如何使用 waitgroup 来实现这个功能,感谢您的回答

更多关于[go] 我的程序中如何实现Golang多线程编程的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


NobbZ:

如果你向 Other() 传递一个 Sre 而不是分别传递它的每个字段,可能会更容易阅读。

谢谢,我同意,是的,我可以将整个结构体传递给函数,但我仍然不明白如何在不使用 for 循环的情况下实现多线程(我去读手册了=)

func main() {
    fmt.Println("hello world")
}

在 Go 语言中,运行时管理的线程数量是有限的。这些线程将用于运行你的协程。

在我看来,你的代码似乎已经尽可能实现了并发。

你为每个元素启动一个协程,并同时处理它们。


编辑

不过,如果你向 Other() 传递一个 Sre 结构体,而不是分别传递它的每个字段,代码可能会更易读。

func main() {
    fmt.Println("hello world")
}

在Go中实现并发处理可以使用goroutine和sync.WaitGroup来确保所有任务完成。以下是修改后的代码示例:

package main

import (
    "sync"
)

type Sre struct {
    Name    string `json:"Namesre"`
    Url     string `json:"Url"`
    P_name  string `json:"P_name"`
    P_email string `json:"P_email"`
    Other   string `json:"Other_params"`
    Create  string `json:"Create"`
    Base    string `json:"Base"`
}

type Settings struct {
    Sres []Sre
}

var settings Settings

func main() {
    var wg sync.WaitGroup
    
    for i := 0; i < len(settings.Sres); i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()
            Other(settings.Sres[index].Name,
                settings.Sres[index].Url,
                settings.Sres[index].P_name,
                settings.Sres[index].P_email,
                settings.Sres[index].Other,
                settings.Sres[index].Create,
                settings.Sres[index].Base)
        }(i)
    }
    
    wg.Wait()
}

func Other(param1 string, param2 string, param3 string, param4 string, param5 string, param6 string, param7 string) {
    // 处理逻辑
}

关键改进:

  1. 使用sync.WaitGroup来等待所有goroutine完成
  2. 通过闭包传递循环索引i,避免goroutine间的数据竞争
  3. 每个goroutine开始时wg.Add(1),结束时wg.Done()
  4. 主goroutine通过wg.Wait()等待所有任务完成

这样就能创建100个goroutine并行处理所有元素。

回到顶部