在当今的软件开辟范畴,并发编程曾经成为进步利用顺序机能跟呼应速度的关键技巧。Golang(Go言语)以其简洁的语法、高效的机能以及内置的并发支撑,在后端开辟范畴备受青睐。本文将深刻探究Golang中的多线程编程,经由过程实战案例剖析跟高效并发编程技能,帮助读者解锁Golang多线程的魅力。
Goroutine是Golang并发编程的核心,它是一种比线程更轻量级的并发履行单位。Goroutine由Go运转时管理,可能并发履行多个Goroutine,而无需担心线程创建、调理跟同步等成绩。
package main
import "fmt"
func main() {
go func() {
fmt.Println("Hello from goroutine!")
}()
fmt.Println("Hello from main function!")
}
Channel是Golang顶用于goroutine之间通信的重要机制。Channel可能是带缓冲的或非缓冲的,可能确保数据传输的次序性跟保险性。
package main
import "fmt"
func produce(c chan int) {
for i := 0; i < 5; i++ {
c <- i
}
close(c)
}
func consume(c chan int) {
for v := range c {
fmt.Println(v)
}
}
func main() {
c := make(chan int)
go produce(c)
go consume(c)
}
WaitGroup是Golang顶用于等待一组goroutine实现履行的东西。
package main
import (
"fmt"
"sync"
)
func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
for j := range jobs {
fmt.Println("worker", id, "started job", j)
time.Sleep(time.Second)
fmt.Println("worker", id, "finished job", j)
results <- j
}
}
func main() {
const numWorkers = 3
jobs := make(chan int, 100)
results := make(chan int, 100)
var wg sync.WaitGroup
for w := 0; w < numWorkers; w++ {
wg.Add(1)
go worker(w, jobs, results, &wg)
}
for j := 0; j < 9; j++ {
jobs <- j
}
close(jobs)
wg.Wait()
close(results)
for a := 0; a < 9; a++ {
<-results
}
}
package main
import (
"fmt"
"net/http"
"sync"
)
func handleRequest(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
}
func main() {
var wg sync.WaitGroup
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
wg.Add(1)
go func() {
defer wg.Done()
handleRequest(w, r)
}()
})
http.ListenAndServe(":8080", nil)
wg.Wait()
}
package main
import (
"fmt"
"net/http"
"sync"
)
var (
users = make(map[string]*sync.Mutex)
room = make(chan string)
)
func main() {
http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {
username := r.URL.Query().Get("username")
users[username] = &sync.Mutex{}
fmt.Fprintf(w, "Welcome, %s!", username)
})
http.HandleFunc("/chat", func(w http.ResponseWriter, r *http.Request) {
username := r.URL.Query().Get("username")
message := r.URL.Query().Get("message")
users[username].Lock()
room <- fmt.Sprintf("%s: %s", username, message)
users[username].Unlock()
fmt.Fprintf(w, "Message sent!")
})
go func() {
for msg := range room {
fmt.Println(msg)
}
}()
http.ListenAndServe(":8080", nil)
}
经由过程以上实战案例跟高效并发编程技能,信赖读者曾经对Golang多线程编程有了更深刻的懂得。在现实开辟中,一直现实跟总结,才干更好地控制并发编程技巧。