Maison > développement back-end > Golang > Framework Golang et framework Elixir : une perspective unique sur la programmation concurrente

Framework Golang et framework Elixir : une perspective unique sur la programmation concurrente

PHPz
Libérer: 2024-06-06 13:04:57
original
500 Les gens l'ont consulté

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é.

Framework Golang et framework Elixir : une perspective unique sur la programmation concurrente

Golang Framework et Elixir Framework : une perspective unique sur la programmation simultanée

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.

Goroutine de Golang

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
}
Copier après la connexion

Erlang VM

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
Copier après la connexion

Cas pratique : Crawling parallèle

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))
}
Copier après la connexion

Conclusion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal