>  기사  >  백엔드 개발  >  Golang 코루틴의 수명주기를 제어하는 ​​방법은 무엇입니까?

Golang 코루틴의 수명주기를 제어하는 ​​방법은 무엇입니까?

WBOY
WBOY원래의
2024-05-31 18:05:001077검색

Go 코루틴의 수명 주기 제어는 다음과 같은 방법으로 수행할 수 있습니다. 코루틴 만들기: go 키워드를 사용하여 새 작업을 시작합니다. 코루틴 종료: 모든 코루틴이 완료될 때까지 기다리고 sync.WaitGroup을 사용합니다. 채널 폐쇄 신호를 사용하세요. 컨텍스트 context.Context를 사용하십시오.

如何控制 Golang 协程的生命周期?

Go 코루틴의 수명 주기를 어떻게 제어하나요?

Go 언어에서 코루틴(고루틴이라고도 함)은 메인 스레드를 차단하지 않고 특정 작업을 수행하는 데 사용되는 경량 동시 실행 기관입니다. 강력하고 유지 관리가 가능한 병렬 코드를 작성하려면 코루틴의 수명 주기를 관리하는 것이 중요합니다.

코루틴 만들기

코루틴을 만들려면 go 키워드를 사용하세요. 메인 스레드가 계속 실행될 수 있도록 백그라운드에서 새 작업을 시작합니다. go 关键字创建协程。它在后台启动一个新的任务,使主线程可以继续执行。

go func() {
    // 执行任务
}

终止协程

无法直接终止协程,但有以下方法可以间接达到此目的:

等待所有协程完成

使用 sync.WaitGroup 同步任务完成:

import "sync"

var wg sync.WaitGroup

func main() {
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(i int) {
            // 执行任务
            wg.Done()
        }(i)
    }
    wg.Wait()
}

使用通道关闭信号

使用通道向协程发送"关闭"信号:

func main() {
    done := make(chan struct{})
    for i := 0; i < 5; i++ {
        go func(i int) {
            for {
                select {
                case <-done:
                    return // 协程停止
                default:
                    // 执行任务
                }
            }
        }(i)
    }
    close(done) // 向所有协程发送"关闭"信号
}

使用上下文

使用 context.Context

import "context"

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    for i := 0; i < 5; i++ {
        go func(i int) {
            for {
                select {
                case <-ctx.Done():
                    return // 协程停止
                default:
                    // 执行任务
                }
            }
        }(i)
    }
    cancel() // 取消上下文
}

코루틴 종료

코루틴을 직접 종료할 수는 없지만 이 목적을 간접적으로 달성할 수 있는 다음 방법이 있습니다.

모든 코루틴이 완료될 때까지 대기

sync.WaitGroup사용 > 동기화 작업 완료: 🎜
package main

import "fmt"
import "time"

func main() {
    // 使用信道告诉协程何时退出
    stop := make(chan struct{})

    // 创建 5 个协程
    for i := 0; i < 5; i++ {
        go func(i int) {
            for {
                // 检查是否已经收到退出信号
                select {
                case <-stop:
                    fmt.Printf("协程 %d 已退出\n", i)
                    return
                default:
                    fmt.Printf("协程 %d 正在运行\n", i)
                    time.Sleep(time.Second)
                }
            }
        }(i)
    }

    // 运行 5 秒,然后发送退出信号
    time.Sleep(time.Second * 5)
    close(stop)

    // 等待所有协程退出
    time.Sleep(time.Second * 1)
}

채널 닫기 신호 사용

🎜채널을 사용하여 코루틴에 "닫기" 신호 보내기: 🎜rrreee

컨텍스트 사용

🎜 context.Context 사용 코루틴 실행을 관리합니다. 컨텍스트가 취소되면 코루틴도 종료됩니다. 🎜rrreee🎜실제 사례🎜🎜다음은 채널 닫기 신호를 사용하는 실제 사례입니다.🎜rrreee

위 내용은 Golang 코루틴의 수명주기를 제어하는 ​​방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.