为了账号安全,请及时绑定邮箱和手机立即绑定

Golang http 服务器实现

Golang http 服务器实现

Go
牛魔王的故事 2022-01-17 16:40:53
我读过 net/http 为每个连接启动一个 go 子例程。我有几个问题。但是我还没有看到任何参数来限制生成的新 go 子例程的数量。例如,如果我必须每秒处理 100 万个并发请求,会发生什么?我们是否可以控制生成的 go 子例程?如果它为每个连接生成一个 go 子例程,它不会阻塞我的整个系统吗?为 Go 网络服务器处理大量并发请求的推荐方法是什么?我必须处理异步和同步两种响应情况。
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

Job/Worker 模式是适用于此任务的常见 go 并发模式。


多个 goroutine 可以从单个通道读取,在 CPU 内核之间分配大量工作,因此是工作程序的名称。在 Go 中,这种模式很容易实现——只需启动多个以通道为参数的 goroutine,然后将值发送到该通道——分发和多路复用将由 Go 运行时完成。


package main


import (

    "fmt"

    "sync"

    "time"

)


func worker(tasksCh <-chan int, wg *sync.WaitGroup) {

    defer wg.Done()

    for {

        task, ok := <-tasksCh

        if !ok {

            return

        }

        d := time.Duration(task) * time.Millisecond

        time.Sleep(d)

        fmt.Println("processing task", task)

    }

}


func pool(wg *sync.WaitGroup, workers, tasks int) {

    tasksCh := make(chan int)


    for i := 0; i < workers; i++ {

        go worker(tasksCh, wg)

    }


    for i := 0; i < tasks; i++ {

        tasksCh <- i

    }


    close(tasksCh)

}


func main() {

    var wg sync.WaitGroup

    wg.Add(36)

    go pool(&wg, 36, 50)

    wg.Wait()

}

所有的 goroutine 并行运行,等待通道给它们工作。goroutine 几乎是一个接一个地立即接收它们的工作。


这是一篇关于如何在 go 中每分钟处理 100 万个请求的精彩文章:http: //marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号