首頁 > 後端開發 > Golang > 主體

Golang協程與類 Unix 系統編程

王林
發布: 2024-04-15 16:24:01
原創
858 人瀏覽過

Golang 協程是一種並發執行機制,透過 goroutine 關鍵字創建,用於類別 Unix 系統程式設計。它透過通道實現協程間通信,在實戰中可用於並發 Web 伺服器,提高效能和可擴展性。

Golang协程与类 Unix 系统编程

Golang 協程與類別Unix 系統程式設計

簡介

協程是一種輕量級並發執行機制,它可以大幅提高應用程式的效能,尤其是在處理高並發、IO密集型任務時。 Golang 語言提供了強大的協程支持,使其成為類 Unix 系統程式設計的理想選擇。

協程建立與管理

在Golang 中,可以使用goroutine 關鍵字建立協程:

package main

import (
    "fmt"
    "runtime"
)

func main() {
    go func() {
        fmt.Println("这是另一个协程!")
    }()
    runtime.Gosched() // 主动让出 CPU 给其他协程
}
登入後複製

上述程式碼建立了一個協程,該協程在main 函數之外執行,並列印一條訊息。 runtime.Gosched() 函數主動釋放 CPU 資源,允許其他協程運作。

通道通訊

通道是 Golang 中用於協程間通訊的機制。它們是一種類型安全的、無阻塞的通訊方式:

package main

import (
    "fmt"
    "time"
)

func main() {
    // 创建一个有缓冲的通道,存放整数
    ch := make(chan int, 10)

    // 在一个协程中向通道发送数据
    go func() {
        for i := 0; i < 10; i++ {
            ch <- i
            time.Sleep(100 * time.Millisecond) // 延迟发送数据
        }
        close(ch) // 关闭通道,表示不再发送数据
    }()

    // 在另一个协程中从通道读取数据
    go func() {
        for {
            v, ok := <-ch
            if !ok {
                break // 通道已关闭
            }
            fmt.Println(v)
        }
    }()

    time.Sleep(1100 * time.Millisecond) // 等待协程执行完毕
}
登入後複製

實戰案例:並發Web 伺服器

考慮一個並發Web 伺服器的範例,用於處理客戶請求:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!\n")
    })

    // 使用 Goroutine 同时监听多个端口
    go http.ListenAndServe(":8080", nil)
    go http.ListenAndServe(":8081", nil)

    select {} // 阻塞主协程,保持服务器运行
}
登入後複製

透過使用協程,此伺服器可以在多個連接埠上同時處理請求,從而提高可擴展性和效能。

以上是Golang協程與類 Unix 系統編程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板