Go http server 高并发
先来个段子:【并发处理连接数】
多高?
很高!
到底多高?
没有一亿,都算少了!
.
.
.
然后就没有然后了。。。
“段子 END”
这就是目前中国企业的通病:提个概念,没有答案,最后造成概念也模糊了,其实,我感觉它根本不知道要干什么!从头到脚都是病啊!
下面,我们谈谈,web服务连接和速度问题
现在,随着网络普及,对于服务的响应速度和并发处理能力都有了不同寻常的要求
所以,对于服务的标准也越来越高
我以最简洁的说法把问题描述一下,其它不解释
1. 响应速度,是指:对于客户端请求的事务处理时间的快慢,一般,要用分布式处理来快速得到可以分布式处理的事务的结果
2. 并发处理,是指:对于客户端的请求的事务可以并行在服务端处理,一盘要有线程池,工作者的逻辑概念介入
需要澄清一个概念,并发不是指客户端并发连接到服务器!!!!!!,这个是大多数中国开发者的死穴,而且死不悔改!!!!!
所以,你要好好考虑一下,这些固执的人群里,算不算有你有一个!!!
3. 服务器硬件性能越高,自然并发能力越高(多CPU,多内核);分布式算法优秀,自然响应越快了
好吧,关于文字,我就算这么多,我的博文不是教小白上路的,而是给学者指出路上哪里有坑的。希望你好好揣摩,也许直到今天你也是不懂web的吧
//DEMO
下面,还是上例程,出自于国外的一篇文章。
原作者,出于公司商业性质,说了90%的话,剩下的10%有问题,这些都体现在他给出的源码里露出了马脚,当然这就是把正确改不能用的代价。原谅他吧,搁你身上也一样。这就是公司,万恶的公司,不关作者的事,他只是想得意一下而已!
如果你看了他的文章和源码,你还是跑不起来的,所以,听我的,看我的吧
还是那句话,不过多解释,但不会不说明,如果你需要掰着指头教你写1,2,3,那么请回到亲爱的小学,去找老去的园丁吧,哈哈哈(对了,推荐电影:神秘代码)
/////////////////////////////////////
//go-server-effic.go
package main
import (
"fmt"
"os"
"runtime"
"net/http"
)
var (
//Max_Num = os.Getenv("MAX_NUM")
MaxWorker = runtime.NumCPU()
MaxQueue = 1000
)
type Serload struct {
pri string
}
type Job struct {
serload Serload
}
var JobQueue chan Job
type Worker struct {
WorkerPool chan chan Job
JobChannel chan Job
Quit chan bool
}
func NewWorker(workPool chan chan Job) Worker {
return Worker {
WorkerPool:workPool,
JobChannel:make(chan Job),
Quit:make(chan bool),
}
}
func (w Worker) Start() {
go func() {
for {
w.WorkerPool <- w.JobChannel
select {
case job:= <- w.JobChannel:
// excute job
fmt.Println(job.serload.pri)
case <- w.Quit:
return
}
}
}()
}
func (w Worker) Stop() {
go func() {
w.Quit <- true
}()
}
type Dispatcher struct {
MaxWorkers int
WorkerPool chan chan Job
Quit chan bool
}
func NewDispatcher(maxWorkers int) *Dispatcher {
pool := make(chan chan Job, maxWorkers)
return &Dispatcher{MaxWorkers:maxWorkers, WorkerPool:pool, Quit:make(chan bool)}
}
func (d *Dispatcher) Run() {
for i:=0; i<d.MaxWorkers; i++ {
worker := NewWorker(d.WorkerPool)
worker.Start()
}
go d.Dispatch()
}
func (d *Dispatcher) Stop() {
go func() {
d.Quit <- true
}()
}
func (d *Dispatcher) Dispatch() {
for {
select {
case job:=<- JobQueue:
go func(job Job) {
jobChannel := <- d.WorkerPool
jobChannel <- job
}(job)
case <- d.Quit:
return
}
}
}
func entry(res http.ResponseWriter, req *http.Request) {
// fetch job
work := Job{serload:Serload{pri:"Just do it"}}
JobQueue <- work
fmt.Fprintf(res, "Hello World ...again")
}
func init() {
runtime.GOMAXPROCS(MaxWorker)
JobQueue = make(chan Job, MaxQueue)
dispatcher := NewDispatcher(MaxWorker)
dispatcher.Run()
}
func main() {
Port := "8086"
IsHttp := true
arg_num := len(os.Args)
if 2<=arg_num {
Port = os.Args[1]
}
if 3<=arg_num {
if os.Args[2]=="true" {
IsHttp = true
} else {
IsHttp = false
}
}
fmt.Printf("server is http %t\n", IsHttp)
fmt.Println("server listens at ", Port)
http.HandleFunc("/", entry)
var err error
if IsHttp {
err = http.ListenAndServe(":"+Port, nil)
} else {
err = http.ListenAndServeTLS(":"+Port, "server.crt", "server.key", nil)
}
if err != nil {
fmt.Println("Server failure /// ", err)
}
fmt.Println("quit")
}
//结果


Finally:
为了避免大家陷入困境,我只给大家指出思路,这样就不会引导大家进入似懂非懂的怪圈
1. 协程池里的协程数目应该与CPU内核数一致,这个好理解,这时候效率和利用率都是最高的
2. 每个协程运行一个工作者出来处理客户端请求(我们就是简单的打印出“Just do it”而已,不在于复杂度,在于处理流程)
好吧,再简单讲讲代码
首先,请自己去学习:Go的协程和渠道(文字概念可以去看书,例子,我之前的博文都有涉及,保证都是可运行的例子)
这个demo的核心:
1. 工作者工作协程,挂入调度器,取Job,执行Job,周而复始
2. 调度器,从Job队列取Job,分配给工作者,周而复始
3. web响应里,模拟了客户的请求-Job,并将此Job放入Job队列,只有有客户端请求,就周而复始的工作
好了,真的好了

师傅领进门,修行在个人
哈哈,我是教"孙悟空"的导师!,哈哈哈哈哈
祝你Go的快,Go的好,Go的高
关于Go,大概真的只能到这里啦,天下没有不散的宴席,就到这儿吧
祝,顺利!!!!!
Go http server 高并发的更多相关文章
- 关于SQL SERVER高并发解决方案
现在大家都比较关心的问题就是在多用户高并发的情况下,如何开发系统,这对我们程序员来说,确实是值得研究,最近找工作面试时也经常被问到,其实我早有去关心和了解这类问题,但一直没有总结一下,导致面试时无法很 ...
- SQL Server 高并发Insert数据解析,实践
在现实的生产环境中,有可能遇到高并发insert的应用.在此应用时由于堆表(Heap)和聚集表的结构不同导致在高并发的情形下insert效率不尽相同.接下来我会简单的以测试用例来简要说明.并举例说明如 ...
- ql Server 高频,高并发访问中的键查找死锁解析
死锁对于DBA或是数据库开发人员而言并不陌生,它的引发多种多样,一般而言,数据库应用的开发者在设计时都会有一定的考量进而尽量避免死锁的产生.但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库 ...
- Sql Server 高频,高并发访问中的键查找死锁解析
死锁对于DBA或是数据库开发人员而言并不陌生,它的引发多种多样,一般而言,数据库应用的开发者在设计时都会有一定的考量进而尽量避免死锁的产生.但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库 ...
- 如何在高并发分布式系统中生成全局唯一Id
月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也讨论了这个主题,我受益匪浅啊…… 博文示例: 1. ...
- 协程--gevent模块(单线程高并发)
先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行.这种 ...
- PHP写的异步高并发服务器,基于libevent
PHP写的异步高并发服务器,基于libevent 博客分类: PHP PHPFPSocketLinuxQQ 本文章于2013年11月修改. swoole已使用C重写作为PHP扩展来运行.项目地址:h ...
- 用Netty开发中间件:高并发性能优化
用Netty开发中间件:高并发性能优化 最近在写一个后台中间件的原型,主要是做消息的分发和透传.因为要用Java实现,所以网络通信框架的第一选择当然就是Netty了,使用的是Netty 4版本.Net ...
- java系统高并发解决方案-转
转载博客地址:http://blog.csdn.net/zxl333/article/details/8685157 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图 ...
随机推荐
- 【RMAN】RMAN-05001: auxiliary filename conflicts with the target database
oracle 11.2.0.4 运行以下脚本,使用活动数据库复制技术创建dataguard备库报错rman-005001: run{ duplicate target database for sta ...
- virtuanenv+flask
1.virtualenv&flask 专门为特定项目创建一个目录和一个虚拟的Python 运行环境 # 1.安装 virtualenv$ pip3 install virtualenv #.创 ...
- iOS-原生纯代码约束总结(一)之 AutoresizingMask
一,概述 iOS有两大自动布局利器:autoresizing 和 autolayout(autolayout是IOS6以后新增).autoresizing是UIView的属性,一直存在,使用也比较简单 ...
- git知识点
先说几个名词 未被追踪的文件:指的是新建的文件或文件夹且还没加入到暂存区(新建的还没有被git add 过得) 未加入到暂存区的文件:指的是已经被追踪过,但是没有加入到暂存区(已经执行过git add ...
- LeetCode 226 Invert Binary Tree 解题报告
题目要求 Invert a binary tree. 题目分析及思路 给定一棵二叉树,要求每一层的结点逆序.可以使用递归的思想将左右子树互换. python代码 # Definition for a ...
- NodeJS笔记(一)-免安装设置
之前在官网下载的nodejs win64版本4.* 最近发现nodejs都已经更新到了7.X 稳定版都升级到了6.X ,nodejs升级的真是神速了,想要升级下, 使用官方给的方法更新失败(使用的是n ...
- 【托业】【新托业TOEIC新题型真题】学习笔记13-题库四-P7
>counterpart 对应的人 >Master of Business Administration 工商管理学硕士 >superb 极好的 >executive 执行总监 ...
- (4.1)mysql备份还原——mysql常见故障
(4.1)mysql备份还原——mysql常见故障 1.常见故障类型 在数据库环境中,常见故障类型: 语句失败,用户进程失败,用户错误 实例失败,介质故障,网络故障 其中最严重的故障主要是用户错误和介 ...
- RN Animated透明度动画
主要代码解析: 如果我们希望吧Animated.Value从0变化到1,把组件位置从60px移动到0px,把不透明度从0编导1,就可以使用style的属性来实现 <Animated.Text s ...
- Tensorflow安装记录
一.安装Ubantu环境 下载ios 网址:http://cn.ubuntu.com/download/ 2.配合虚拟机进行安装环境 虚拟机直接百度下载即可 虚拟机采用 具体安装,虚拟机百度中很多记录 ...