Go through goroutine에서는 동시 프로그래밍이 구현되어 여러 작업을 동시에 실행할 수 있어 효율성이 향상됩니다. 사용 사례는 다음과 같습니다. 병렬 처리 이벤트 처리 I/O 집약적 작업 HTTP 서비스 작업 스케줄링
Go 동시 프로그래밍의 사용 사례 및 시나리오에 대한 자세한 설명
소개
동시 프로그래밍은 다음을 허용하는 프로그래밍 패러다임입니다. 우리는 여러 작업을 동시에 수행합니다. Go 언어에서는 경량 스레드인 고루틴을 통해 동시 프로그래밍이 구현됩니다. 이 기사에서는 Go에서 동시 프로그래밍의 사용 사례와 시나리오를 살펴보고 실제 예제를 제공합니다.
사용 사례 및 시나리오
1. 병렬 처리
2. 이벤트 처리
3. I/O 집약적인 작업
4. HTTP 서비스
5. 작업 예약
실용적인 예
예 1: 동시 이미지 처리
package main import ( "fmt" "image" "image/color" "image/draw" "runtime" ) func main() { width, height := 1000, 1000 images := []image.Image{} // 并行创建 100 个图像 for i := 0; i < 100; i++ { img := image.NewRGBA(image.Rect(0, 0, width, height)) draw.Draw(img, img.Bounds(), &image.Uniform{color.RGBA{0, 0, 0, 255}}, image.ZP, draw.Src) images = append(images, img) } // 计算创建图像所花费的时间 numCPUs := runtime.NumCPU() start := time.Now() for i := 0; i < 100; i++ { go createImage(images[i]) } // 等待所有 Goroutine 完成 time.Sleep(10 * time.Second) elapsed := time.Since(start) fmt.Printf("Creating %d images using %d CPUs took %s\n", len(images), numCPUs, elapsed) } func createImage(img image.Image) { // 模拟耗时的图像处理操作 time.Sleep(500 * time.Millisecond) }
예 2: WebSocket 메시지 처리
package main import ( "errors" "fmt" "net/http" "sync/atomic" "github.com/gorilla/websocket" ) type client struct { conn *websocket.Conn name string } var ( upgrader = websocket.Upgrader{} messages = make(chan string) ) var connectedClients uint64 func main() { http.HandleFunc("/websocket", serveWebSocket) // 启动 Goroutine 来处理传入消息 go handleMessage() if err := http.ListenAndServe(":8080", nil); err != nil { fmt.Println(err) } } func serveWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { fmt.Println(err) return } atomic.AddUint64(&connectedClients, 1) go handleConnection(conn) } func handleConnection(conn *websocket.Conn) { defer func() { conn.Close() atomic.AddUint64(&connectedClients, -1) }() // 监听来自客户端的消息 for { _, message, err := conn.ReadMessage() if err != nil { if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { fmt.Println(err) } return } messages <- message } } func handleMessage() { for message := range messages { // 处理消息逻辑 fmt.Println("Received message:", message) // 例如,将消息广播给所有已连接的客户端 for clients.Range(func(_, v interface{}) bool { client := v.(client) if err := client.conn.WriteMessage(websocket.TextMessage, []byte(message)); err != nil { if errors.Is(err, websocket.ErrCloseSent) { clients.Delete(client.name) fmt.Printf("Client %s disconnected\n", client.name) } } return true }) { } } }
위 내용은 Go 동시 프로그래밍의 사용 사례 및 시나리오에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!