Heim  >  Artikel  >  Backend-Entwicklung  >  Verwaltung und Planung von Goroutinen in der gleichzeitigen Go-Programmierung

Verwaltung und Planung von Goroutinen in der gleichzeitigen Go-Programmierung

PHPz
PHPzOriginal
2024-06-04 16:42:00832Durchsuche

Goroutine in der Go-Sprache kann auf folgende Weise verwaltet werden: 1. Goroutine erstellen: Verwenden Sie das Schlüsselwort „go“. 2. Warten Sie, bis die Goroutine beendet wird: Verwenden Sie WaitGroup. 3. Goroutine abbrechen: Verwenden Sie context.Context und context.WithCancel. In Bezug auf die Planung verwendet Go einen präventiven Planungsalgorithmus, die Funktion runtime.Gosched() kann jedoch verwendet werden, um eine kooperative Planung auszulösen.

Verwaltung und Planung von Goroutinen in der gleichzeitigen Go-Programmierung

Goroutine-Verwaltung und -Planung in der gleichzeitigen Go-Programmierung

Goroutine ist eine leichte Einheit zur gleichzeitigen Ausführung in der Go-Sprache, die einer Coroutine ähnelt. Um Goroutinen effektiv zu verwalten und zu planen und dadurch die Leistung und Stabilität gleichzeitiger Programme zu verbessern, bietet die Go-Sprache eine umfangreiche API.

Goroutine-Lebenszyklusmanagement

  • Goroutine erstellen: Verwenden Sie das Schlüsselwort go, um Goroutine zu erstellen, wie unten gezeigt: go 关键字创建 goroutine,如下所示:

    go func() {
    // Goroutine 代码
    }
  • 等待 goroutine 退出:使用 WaitGroup 类型等待所有 goroutine 退出,如下所示:

    var wg sync.WaitGroup
    wg.Add(numOfWorkers)
    
    for i := 0; i < numOfWorkers; i++ {
    go func(i int) {
      // Goroutine 代码
      wg.Done()
    }(i)
    }
    
    wg.Wait()
  • 取消 goroutine:使用 context.Contextcontext.WithCancel 函数取消 goroutine 的执行,如下所示:

    ctx, cancel := context.WithCancel(context.Background())
    
    go func() {
    // Goroutine 代码
    select {
    case <-ctx.Done():
      return
    }
    }
    
    // 取消 goroutine
    cancel()

Goroutine 调度

Go 语言中内置的调度器负责管理和调度 goroutine。它通过以下算法来决定何时启动 goroutine:

  • 抢占式调度:调度器可以打断正在运行的 goroutine,切换到另一个 goroutine 执行。
  • 协作式调度:goroutine 主动让出控制权,交给调度器调度其他 goroutine。

默认情况下,Go 语言使用抢占式调度算法,但对于某些场景,协作式调度更加合适。可以使用 runtime.Gosched()

package main

import "fmt"
import "sync"

func main() {
  // 创建 goroutine 池
  pool := make(chan func())

  // 启动 goroutine 池中的 worker
  for i := 0; i < 10; i++ {
    go func() {
      for {
        // 从池中获取任务
        task := <-pool

        // 执行任务
        task()
      }
    }()
  }

  // 发送任务到池中
  for i := 0; i < 100; i++ {
    pool <- func() {
      fmt.Println("Task", i)
    }
  }

  // 等待任务完成
  var wg sync.WaitGroup
  wg.Add(100)
  for i := 0; i < 100; i++ {
    go func() {
      defer wg.Done()
      <-pool
    }()
  }
  wg.Wait()

  // 关闭池
  close(pool)
}

Warten Sie, bis Goroutine beendet wird:

Verwenden WaitGroup wartet darauf, dass alle Goroutinen beendet werden, wie unten gezeigt:

rrreee🎜🎜🎜Eine Goroutine abbrechen: 🎜Verwenden Sie context.Context und context.WithCancel Die Funktion bricht die Ausführung der Goroutine ab, wie unten gezeigt: 🎜rrreee🎜Goroutine Scheduling🎜🎜Der in die Go-Sprache integrierte Scheduler ist für die Verwaltung und Planung von Goroutinen verantwortlich. Es verwendet den folgenden Algorithmus, um zu entscheiden, wann eine Goroutine gestartet werden soll: 🎜🎜🎜🎜Präventive Planung: 🎜Der Planer kann eine laufende Goroutine unterbrechen und zur Ausführung zu einer anderen Goroutine wechseln. 🎜🎜Gemeinsame Planung: 🎜goroutine gibt die Kontrolle aktiv ab und übergibt sie an den Planer, um andere Goroutinen zu planen. 🎜Standardmäßig verwendet die Go-Sprache einen präventiven Planungsalgorithmus, für einige Szenarien ist jedoch eine kollaborative Planung besser geeignet. Die kooperative Planung kann mit der Funktion runtime.Gosched() ausgelöst werden. 🎜🎜Praktischer Fall🎜🎜Das Folgende ist ein Beispiel für die Verwendung von Goroutine zur gleichzeitigen Verarbeitung von Aufgaben: 🎜rrreee

Das obige ist der detaillierte Inhalt vonVerwaltung und Planung von Goroutinen in der gleichzeitigen Go-Programmierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn