golang 的 goroutine 和 elixir 的 erlang vm 提供了独特的并发编程模型。golang 使用轻量级并行线程 (goroutine) 在单个进程中高效调度任务,elixir 基于 erlang 虚拟机 (beam),通过进程机制表示并发性。实战案例中,使用 goroutine 或 erlang vm 可并行执行爬取任务,提高效率。
Golang框架与Elixir框架:并发编程的独特视角
在现代软件开发中,并发编程已成为必不可少的技术。Golang 和 Elixir 是两大流行的编程语言,它们提供了独特的并发编程模型,在本教程中,我们将探讨这些模型并通过实战案例进行演示。
Golang 的 Goroutine
Golang 提供了一种称为 goroutine 的轻量级并行线程,它允许并发执行任务,而不会阻塞调用它的函数。goroutine 使用协程机制,可以在单个进程中高效地调度多个并发操作。
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 的 Erlang VM
Elixir 是基于 Erlang 虚拟机 (BEAM) 的,它是一种高度并发且容错的运行时环境。BEAM 执行 Erlang、Elixir 和其他基于 BEAM 的语言,并提供一种称为进程的机制来表示并发性。
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
实战案例:并行爬取
使用 Golang 的 Goroutine 或 Elixir 的 Erlang VM,我们可以并行执行爬取任务。以下是一个使用 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("爬取成功: %sn内容:n%s", url, contents)
}(url)
}
// 等待所有 goroutine 完成
wg.Wait()
close(results)
// 打印结果
for result := range results {
fmt.Println(result)
}
fmt.Printf("爬取完成,用时:%vn", time.Since(startTime))
}
结论
Golang 的 Goroutine 和 Elixir 的 Erlang VM 提供了独特且强大的并发编程模型。通过使用 goroutine 和进程,我们可以高效地执行并行任务并构建高性能应用程序。