golang 单频道版本的http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 单频道版本的http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang相关的知识,希望对你有一定的参考价值。

// Worker represents the worker that executes the job
type Worker struct {
	JobChannel chan Job
	quit       chan bool
}

func NewWorker(jobChannel chan Job) Worker {
	return Worker{
		JobChannel: jobChannel,
		quit:       make(chan bool)}
}

// Start method starts the run loop for the worker, listening for a quit channel in
// case we need to stop it
func (w Worker) Start() {
	go func() {
		for {
			select {
			case job := <-w.JobChannel:
				// we have received a work request.
				if err := job.Payload.UploadToS3(); err != nil {
					log.Errorf("Error uploading to S3: %s", err.Error())
				}

			case <-w.quit:
				// we have received a signal to stop
				return
			}
		}
	}()
}

func (w Worker) Stop() {
	go func() {
		w.quit <- true
	}()
}

type Dispatcher struct {
	JobChannel chan Job
}

func NewDispatcher(maxWorkers int) *Dispatcher {
	pool := make(chan Job, maxWorkers)
	return &Dispatcher{JobChannel: pool}
}

func (d *Dispatcher) Run() {
	// starting n number of workers
	for i := 0; i < d.maxWorkers; i++ {
		worker := NewWorker(d.JobChannel)
		worker.Start()
	}

	go d.dispatch()
}

func (d *Dispatcher) dispatch() {
	for {
		select {
		case job := <-JobQueue:
			// a job request has been received
			go func(job Job) {
				// dispatch the job to the workers job channel
				// we can buffer up to one job per worker
				d.JobChannel <- job
			}(job)
		}
	}
}

Golang 频道选择语句

【中文标题】Golang 频道选择语句【英文标题】:Golang channels select statement 【发布时间】:2013-11-20 19:48:17 【问题描述】:

最近刚尝试使用 go。我想知道如果您有一条 select 语句在几个频道上等待通信,并且如果一条消息同时在两个或更多频道上出现,会发生什么。如果所有消息同时到达,select 将如何确定接受哪个通道?

谢谢!

【问题讨论】:

Golang 规范确实值得一读。至少略读一遍,然后在你不熟悉的领域更深入地阅读。你会很高兴你做到了:) 【参考方案1】:

来自the spec:

如果可以进行多个情况,则进行统一的伪随机选择来决定将执行哪个单个通信。

所以选择是不确定的。

【讨论】:

这种非确定性是 CSP 的重要组成部分,Go 建立了它的通道。并发活动在 CSP 中是严格确定的,这是违反直觉的。只有做出选择(即选择)时才会出现非确定性。 @Rick-777 Nondeterministic Choice 是 absent from Hoare’s original 1978 paper。 CSP 在 70 年代末和 80 年代初分阶段发展。 Occam 直接基于 CSP 但仅包含非确定性选择;不需要确定性选择。 Go 在这方面就像 Occam。

以上是关于golang 单频道版本的http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang的主要内容,如果未能解决你的问题,请参考以下文章

golang [去阻塞频道]与Go#golang,#go,#go channels,#go synchronization,#goroutines,#waitgroups中的频道同步和阻止,

golang golang频道测试

为啥我的 Golang 频道写入永远阻塞?

Golang频道睡着了

Golang频道发行

选择中的Golang频道未接收