go语言实现线程池

话说真的好久没有写博客了,最近赶新项目,工作太忙了。这一周任务比较少,又可以随便敲敲了。 逛论坛的时候突发奇想,想用go语言实现一个线程池,主要功能是:添加total个任务到线程池中,线程池开启number个线程,每个线程从任务队列中取出一个任务执行,执行完成后取下一个任务,全部执行完成后回调一个函数。 不知道有没有卵用,但是我尝试用它开启3个线程,下载10个文件,效果还是不错的。第一次写这方面的东西,可能写得不好。 思路就是把任务放到channel里,每个线程不停的从channel中取出任务执...阅读全文

2015-07-22 15:32 wolfred7464
阅读:13599 评论:0

Goroutine(协程)为何能处理大并发?

简单来说:协程十分轻量,可以在一个进程中执行有数以十万计的协程,依旧保持高性能。 进程、线程、协程的关系和区别: 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。 堆和栈的区别请参看:http://www.cnblogs.com/ghj1976/p/3623037.html 协程和线程的区别是:协程避免了无意义的调度...阅读全文

阅读:17972 评论:0

Golang-简洁的并发

多核处理器越来越普及。有没有一种简单的办法,能够让我们写的软件释放多核的威力?是有的。随着Golang, Erlang, Scala等为并发设计的程序语言的兴起,新的并发模式逐渐清晰。正如过程式编程和面向对象一样,一个好的编程模式有一个极其简洁的内核,还有在此之上丰富的外延。可以解决现实世界中各种各样的问题。本文以GO语言为例,解释其中内核、外延。 并发模式之内核 这种并发模式的内核只需要 协程 和 通道 就够了。协程负责执行代码,通道负责在协程之间传递事件。 不久前,并发编程是个非常困难的事。...阅读全文

阅读:2815 评论:0

Golang网页下载示例

package main /* * 中文编码问题 */ import ( "errors" "flag" "fmt" query "github.com/PuerkitoBio/goquery" "golang.org/x/text/encoding/simplifiedchinese" "io/ioutil" "net/http" "os" "path/filepath" "runtime" "strings" "sync" ) var ( np = runtime.NumCPU() _ = ...阅读全文

2015-07-28 09:37 dexterman
阅读:4291 评论:0

golang channel 用法转的

一、Golang并发基础理论 Golang在并发设计方面参考了C.A.R Hoare的CSP,即Communicating Sequential Processes并发模型理论。但就像John Graham-Cumming所说的那样,多数Golang程序员或爱好者仅仅停留在“知道”这一层次,理解CSP理论的并不多,毕竟多数程序员是搞工程 的。不过要想系统学习CSP的人可以从这里下载到CSP论文的最新版本。 维基百科中概要罗列了CSP模型与另外一种并发模型Actor模型的区别: Actor模型广义...阅读全文

阅读:12420 评论:0

Go 语言内存模型

备份一下 Go 语言内存模型 http://docscn.studygolang.com/ref/mem Go 内存模型 版本:2012年3月6日 || 译者:Oling Cat,Ants Arks,特别感谢 Fall Ark 的帮助 引言事件的发生次序同步初始化Go程的创建Go程的销毁信道通信锁Once 类型错误的同步 引言 Go内存模型阐明了一个Go程对某变量的写入,如何才能确保被另一个读取该变量的Go程监测到。 事件的发生次序 在单个Go程中,读取和写入的表现必须与程序指定的执行顺序相一致...阅读全文

2015-06-11 15:38 zhangcunli
阅读:3144 评论:1

Go 1.5的并发特性与案例

Go语言最有用的特性是将并发作为第一支持的语言,使用协程goroutine, 非常容易实现代码的并发,这使得Go成为网络类应用的重要选择,本文以银行转账为例,阐述了Go 1.5新版本中如何使用协程实现并发。该文还指出了在Go 1.5版本之间所有协程只是运行在单个进程,并不支持多核CPU并行计算,1.5以后提升到支持多核。 Golang Security and Concurrency 下面代码是一段协程的实现: func hello() { println("Hello!") ...阅读全文

阅读:6811 评论:0

Go 并发

goroutine 是 Go 并发能力的核心要素。但是,goroutine 到底是什么? 叫做 goroutine 是因为已有的短语 — 线程、协程、进程等等 — 传递了不准确的含义。 goroutine 有简单的模型:它是与其他 goroutine 并行执行的,有着相同地址空间的函数。它是轻量的,仅比分配栈空间多一点点消耗。而初始时栈是很小的,所以它们也是廉价的,并且随着需要在堆空 间上分配(和释放)。 goroutine 是一个普通的函数,只是需要使用保留字 go 作为开头。 ready("...阅读全文

阅读:2687 评论:1

优化 Go 中的 map 并发存取

Catena (时序存储引擎)中有一个函数的实现备受争议,它从 map 中根据指定的 name 获取一个 metricSource。每一次插入操作都会至少调用一次这个函数,现实场景中该函数调用更是频繁,并且是跨多个协程的,因此我们必须要考虑同步。 该函数从 map[string]*metricSource 中根据指定的 name 获取一个指向 metricSource 的指针,如果获取不到则创建一个并返回。其中要注意的关键点是我们只会对这个 map 进行插入操作。 简单实现如下:(为节省篇幅,省...阅读全文

2015-04-02 10:31 88250
阅读:1848 评论:0

golang(5):编写WebSocket服务,客户端和html5调用

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 转载请必须注明出处! 1,关于websocket HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。 在JavaEE7中也实现了WebSocket协议。 在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 参考: http://ba...阅读全文

2015-07-15 16:23 freewebsys
阅读:7508 评论:0

golang:使用timingwheel进行大量ticker的优化

Ticker 最近的项目用go实现的服务器需要挂载大量的socket连接。如何判断连接是否还存活就是我们需要考虑的一个问题了。 通常情况下面,socket如果被客户端正常close,服务器是能检测到的,但是如果客户端突然拔掉网线,或者是断电,那么socket的状态在服务器看来可能仍然是established。而实际上该socket已经不可用了。 为了判断连接是否可用,通常我们会用timer机制来定时检测,在go里面,这非常容易实现,如下: ticker := time.NewTicker(60 ...阅读全文

阅读:3077 评论:0

Go 的垃圾回收机制在实践中有哪些需要注意的地方?

之前回答问题的时候Go还处在1.1版本,到了1.2和1.3,Go的GC跟踪命令和GC内部实现已经有一些变化,并且根据评论中的反馈,这边一并做补充说明。 Go 1.2之后的GC跟踪环境变量已经改为GODEBUG="gctrace=1",具体参数说明可以参考runtime包的文档。 Go 1.3对GC做了优化,回收机制也改变了,从我的实验观测来看,用做内存存储时候产生的持久性的大量对象,一样是明显拖慢GC暂停时间的,但是函数内创建的局部对象一旦没被引用,是会被立即回收的,可以用runtime.Set...阅读全文

阅读:3701 评论:0

Go语言中Tcp协议粘包问题处理

在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name":"golang","Message":"message"} 当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,这时候服务端才进行接收的话就会收到两个连续的字符串,形如: {"Id":1,"Name":"golang","Message":"message"}{"Id":1,"Name":"golang...阅读全文

2015-08-22 11:08 kenkao
阅读:3699 评论:1

服务发现:Zookeeper vs etcd vs Consul

【编者的话】本文对比了Zookeeper、etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考。 如果使用预定义的端口,服务越多,发生冲突的可能性越大,毕竟,不可能有两个服务监听同一个端口。管理一个拥挤的比方说被几百个服务所使用的所有端口的列表,本身就是一个挑战,添加到该列表后,这些服务需要的数据库和数量会日益增多。因此我们应该部署无需指定端口的服务,并且让Docker为我们分配一个随机的端口。唯一的问题是我们需要发现端口号,并且让别人知道。 当我们开始在一个分布式系统...阅读全文

2015-09-13 国会山上的猫TuxHu
阅读:16953 评论:0

golang中container/list包中的坑

golang中list包用法可以参看http://blog.csdn.net/chenbaoke/article/details/42780895 但是list包中大部分对于e *Element进行操作的元素都可能会导致程序崩溃,其根本原因是e是一个Element类型的指针,当然其也可能为nil,但是golang中list包中函数没有对其进行是否为nil的检查,变默认其非nil进行操作,所以这种情况下,便可能出现程序崩溃。 1.举个简单例子,Remove()函数 package main imp...阅读全文

2015-01-16 20:13 chenbaoke
阅读:10373 评论:1

Go语法简略 - 依赖注入

通过对web应用框架背后原理的探索,引入了依赖注入的概念。如果你需要读懂或者写一个框架的话,依赖注入的思想绝对能帮到你。本文记录对依赖注入的探索。 区分依赖和宿主 现在我们把问题简化一下: package main import "fmt" func MethodA(name string, f func(a int, b string)) { fmt.Println("Enter MethodA:", name) f(3030, "zdd") // 给f注入参数 fmt.Println("Ex...阅读全文

阅读:9451 评论:2

进程、线程、轻量级进程、协程与 go 的 goroutine【转载+整理】

本文内容 进程 线程 协程 Go 中的 goroutine 参考资料 最近,看一些文章,提到“协程”的概念,心想,进程,线程,协程,前两个很容易,任何一本关于操作系统的书都有说,开发时也经常用,但是协程呢?之前也遇到这个词,但是今天,查了一下资料。下面是一个人的总结。 电话面试被问到go的协程……虽然用 python 时候在 Eurasia 和 eventlet 里了解过协程,但自己对协程的概念也就是轻量级线程,还有一个很通俗的红绿灯说法:线程要守规则,协程看到红灯但是没有车仍可以通行。现在总结...阅读全文

2015-10-13 17:30 liuning8023
阅读:4375 评论:1

Golang网络库中socket阻塞调度源码剖析

本文分析了Golang的socket文件描述符和goroutine阻塞调度的原理。代码中大部分是Go代码,小部分是汇编代码。完整理解本文需要Go语言知识,并且用Golang写过网络程序。更重要的是,需要提前理解goroutine的调度原理。 1. TCP的连接对象: 连接对象: 在net.go中有一个名为Conn的接口,提供了对于连接的读写和其他操作: type Conn interface { Read(b []byte) (n int, err error) Write(b []byte) ...阅读全文

2015-05-14 09:41:57 华子
阅读:9490 评论:1

golang 性能分析

http://wangzhezhe.github.io/blog/2016/04/30/golang-gc/ Debugging performance issues in Go programs Profiling Go Programs http://shenfeng.me/go-gc-optimize-map.html http://www.cnblogs.com/gaochundong/p/hashtable_and_perfect_hashing.html#collision_reso...阅读全文

2016-07-26 16:48 B0-1
阅读:3766 评论:0