Home  >  Article  >  Backend Development  >  Golang framework and Elixir framework: a unique perspective on concurrent programming

Golang framework and Elixir framework: a unique perspective on concurrent programming

PHPz
PHPzOriginal
2024-06-06 13:04:57419browse

Golang’s Goroutine and Elixir’s Erlang VM provide unique concurrent programming models. Golang uses lightweight parallel threads (goroutines) to efficiently schedule tasks in a single process, and Elixir is based on the Erlang virtual machine (BEAM) to express concurrency through a process mechanism. In practical cases, Goroutine or Erlang VM can be used to execute crawling tasks in parallel to improve efficiency.

Golang framework and Elixir framework: a unique perspective on concurrent programming

Golang framework and Elixir framework: a unique perspective on concurrent programming

In modern software development, concurrent programming has become an essential technology. Golang and Elixir are two popular programming languages ​​that offer unique concurrent programming models. In this tutorial, we will explore these models and demonstrate them with practical examples.

Golang's Goroutine

Golang provides a lightweight parallel thread called a goroutine, which allows concurrent execution of tasks without blocking the function that calls it. Goroutine uses the coroutine mechanism to efficiently schedule multiple concurrent operations in a single process.

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’s Erlang VM

Elixir is based on the Erlang Virtual Machine (BEAM), a highly concurrent and fault-tolerant runtime environment. BEAM implements Erlang, Elixir, and other BEAM-based languages ​​and provides a mechanism called processes to express concurrency.

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

Practical case: Parallel crawling

Using Golang's Goroutine or Elixir's Erlang VM, we can execute crawling tasks in parallel. The following is an example implemented using 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))
}

Conclusion

Golang’s Goroutine and Elixir’s Erlang VM provide unique and powerful concurrent programming models. By using goroutines and processes, we can efficiently execute parallel tasks and build high-performance applications.

The above is the detailed content of Golang framework and Elixir framework: a unique perspective on concurrent programming. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn