Maison >développement back-end >Golang >Framework Golang et framework Elixir : une perspective unique sur la programmation concurrente
Goroutine de Golang et Erlang VM d'Elixir fournissent des modèles de programmation simultanée uniques. Golang utilise des threads parallèles légers (goroutines) pour planifier efficacement les tâches dans un seul processus, et Elixir est basé sur la machine virtuelle Erlang (BEAM) pour exprimer la concurrence via un mécanisme de processus. Dans des cas pratiques, Goroutine ou Erlang VM peuvent être utilisés pour exécuter des tâches d'exploration en parallèle afin d'améliorer l'efficacité.
Dans le développement de logiciels modernes, la programmation simultanée est devenue une technologie essentielle. Golang et Elixir sont deux langages de programmation populaires qui offrent des modèles de programmation simultanée uniques. Dans ce didacticiel, nous explorerons ces modèles et les démontrerons avec des exemples pratiques.
Golang fournit un thread parallèle léger appelé goroutine qui permet l'exécution simultanée de tâches sans bloquer la fonction qui l'appelle. Goroutine utilise le mécanisme coroutine pour planifier efficacement plusieurs opérations simultanées en un seul processus.
package main import ( "fmt" "runtime" "time" ) func main() { // 创建一个 goroutine go func() { for i := 0; i < 10; i++ { fmt.Println("goroutine:", i) } }() // 主线程继续执行 for i := 0; i < 10; i++ { fmt.Println("main:", i) } // 确保 goroutine 完成后再退出 time.Sleep(1 * time.Second) // 输出 // goroutine: 0 // main: 0 // goroutine: 1 // main: 1 // ... // goroutine: 9 // main: 9 }
Elixir d'Elixir est basé sur la machine virtuelle Erlang (BEAM), un environnement d'exécution hautement concurrent et tolérant aux pannes. BEAM implémente Erlang, Elixir et d'autres langages basés sur BEAM et fournit un mécanisme appelé processus pour exprimer la concurrence.
defmodule MyModule do def main do # 创建一个进程并向其发送消息 spawn(fn -> receive do {_, msg} -> IO.println("进程收到消息: #{msg}") end end) # 主进程继续执行 for i <- 1..10 do send(self(), {self(), "消息 #{i}"}) end end end MyModule.main
En utilisant Goroutine de Golang ou Erlang VM d'Elixir, nous pouvons exécuter des tâches de crawl en parallèle. Voici un exemple implémenté à l'aide de Golang :
package main import ( "fmt" "io/ioutil" "net/http" "runtime" "sync" "time" ) func main() { // 创建一个同步锁来维护结果 var lock sync.Mutex var wg sync.WaitGroup // 创建一个通道来存储结果 results := make(chan string) // 爬取 URL 列表 urls := []string{"www.google.com", "www.amazon.com", "www.facebook.com"} startTime := time.Now() for _, url := range urls { // 创建一个 goroutine 来爬取每个 URL wg.Add(1) go func(url string) { defer wg.Done() // 发送 HTTP 请求 resp, err := http.Get(url) if err != nil { results <- fmt.Sprintf("爬取失败: %s", err) return } // 读取并打印响应内容 contents, err := ioutil.ReadAll(resp.Body) resp.Body.Close() if err != nil { results <- fmt.Sprintf("读取内容失败: %s", err) return } // 使用锁来安全地存储结果 lock.Lock() defer lock.Unlock() results <- fmt.Sprintf("爬取成功: %s\n内容:\n%s", url, contents) }(url) } // 等待所有 goroutine 完成 wg.Wait() close(results) // 打印结果 for result := range results { fmt.Println(result) } fmt.Printf("爬取完成,用时:%v\n", time.Since(startTime)) }
Goroutine de Golang et Erlang VM d'Elixir fournissent un modèle de programmation simultanée unique et puissant. En utilisant des goroutines et des processus, nous pouvons exécuter efficacement des tâches parallèles et créer des applications hautes performances.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!