함수와 고루틴은 다음과 같은 방법으로 통신할 수 있습니다: 뮤텍스 잠금: 공유 리소스를 보호하는 데 사용 조건 변수: 조건을 충족하는 고루틴을 알리는 데 사용 채널: 데이터 전송 버퍼 원자 변수: 잠금 없는 동시 액세스 변수 실제 사례: 병렬 처리 작업 고루틴을 사용하면 작업 생성, 고루틴 처리 작업 시작, 처리 결과 수집의 세 단계로 구성된 컴퓨팅 집약적인 작업의 실행 효율성을 높일 수 있습니다.
Go 언어에서 함수와 고루틴 간의 통신 방법
Go 언어에서 함수와 고루틴은 다음과 같은 방식으로 통신할 수 있습니다.
1 Mutex(Mutex)
Mutex 잠금은 공유 리소스를 보호하고 동시에 하나의 고루틴만 리소스에 액세스할 수 있도록 합니다.
var mu sync.Mutex // 全局互斥锁 func increment(i *int) { mu.Lock() *i++ mu.Unlock() }
2. 조건 변수(Cond)
조건 변수는 지정된 조건이 충족될 때 대기 중인 고루틴에 알리는 데 사용됩니다.
var cond sync.Cond // 全局条件变量 func wait(c *sync.Cond, i *int) { c.L.Lock() for { if *i == 0 { c.Wait() } break } c.L.Unlock() }
3. 채널
채널은 고루틴 간에 데이터를 전송하는 데 사용되는 버퍼입니다.
var ch = make(chan int, 10) // 创建容量为 10 的通道 func send(c chan int, i int) { c <- i // 发送数据 } func receive(c chan int) { v := <-c // 接收数据 }
4. 원자 변수
원자 변수는 잠금 없이 동시에 액세스할 수 있습니다.
var atomicInt int64 func incrementAtomic(i *int64) { atomicInt++ }
실용 사례: 병렬 처리 작업
다음은 고루틴을 사용하여 작업을 병렬로 처리하는 실제 사례입니다.
// 任务类型 type Task struct { Num int Chan chan int } func processTask(t *Task) { // 处理任务并返回结果 result := t.Num * t.Num t.Chan <- result } func createTasks(n int) []*Task { // 创建 n 个任务 tasks := make([]*Task, n) for i := 0; i < n; i++ { tasks[i] = &Task{ Num: i, Chan: make(chan int), } } return tasks } func main() { n := 10 tasks := createTasks(n) // 启动 n 个 Goroutine 并行处理任务 for _, t := range tasks { go processTask(t) } // 从任务中收集处理结果 results := make([]int, n) for i := 0; i < n; i++ { results[i] = <-tasks[i].Chan } // 打印结果 for _, r := range results { fmt.Println(r) } }
고루틴을 사용하여 작업을 병렬로 처리하면 프로그램의 실행 효율성이 크게 향상될 수 있습니다. 특히 계산 집약적인 작업.
위 내용은 golang 함수가 goroutine과 통신하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!