Go语言中文网 为您找到相关结果 521

Scala与Golang的并发实现对比

并发语言俨然是应大规模应用架构的需要而提出,有其现实所需。前后了解了Scala和Golang,深深体会到现代并发语言与旧有的Java、C++等语言在风格及理念上的巨大差异。本文主要针对Scala和Golang这两个我喜爱的并发语言在并发特性上的不同实现,做个比较和阐述,以进一步加深理解。 一. Scala与Golang的并发实现思路Scala语言并发设计采用Actor模型,借鉴了Erlang的Actor实现,并且在Scala 2.10之后,Scala采用的是Akka Actor模型库。Actor模型主要特征如下: “一切皆是参与者”,且各个actor间是独立的; 发送者与已发送消息间解耦,这是Actor模型显著特点,据此实现异步通信; actor是封装状态和行为的对象,通过消息交换进行相互通...阅读全文

Golang 简单理解Channel

什么是channel? channel是Go语言在语言级别提供的goroutine间的通信方式。我们可以使用channel在两个或 多个goroutine之间传递消息。channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,我们建议用 分布式系统的方法来解决,比如使用Socket或者HTTP等通信协议。Go语言对于网络方面也有非常完善的支持。 channel是类型相关的。也就是说,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。如果对Unix管道有所了解的话,就不难理解channel,可以将其认为是一种类 型安全的管道。 (我复制pdf上的。个人理解即是并发编程中各线程...阅读全文

博文 2015-02-09 11:25 未来还没来

[go语言] golang的goroutine机制和runtime.GOMAXPROCS

之前对golang的goroutine机制和runtime.GOMAXPROCS不是很理解,今天抽空研究了一下,学习了其他大牛的文章。把自己的理解写下来。如有错误,请指正 golang的goroutine机制有点像线程池: 一、go 内部有三个对象: P对象(processor) 代表上下文(或者可以认为是cpu),M(work thread)代表工作线程,G对象(goroutine). 二、正常情况下一个cpu对象启一个工作线程对象,线程去检查并执行goroutine对象。碰到goroutine对象阻塞的时候,会启动一个新的工作线程,以充分利用cpu资源。所有有时候线程对象会比处理器对象多很多 我们用如下图分别表示P、M、G 在单核情况下,所有goroutine运行在同一个线程(M0)中,...阅读全文

博文 2015-03-05 13:44 EthanDorisHope

golang sync WaitGroup

刚才看golang的sync的包,看见一个很有用的功能。就是WaitGroup。 先说说WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 WaitGroup总共有三个方法:Add(delta int),Done(),Wait()。简单的说一下这三个方法的作用。 Add:添加或者减少等待goroutine的数量 Done:相当于Add(-1) Wait:执行阻塞,直到所有的WaitGroup数量变成0 例子: package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i ...阅读全文

博文 2014-05-06 20:18 u011511092

go runtime.Gosched()的作用分析

untime.Gosched()用于让出CPU时间片。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。 看代码: package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 2; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") } 输出结果: hello world hello 注意结果: 1、先输出了hello,后输出了world. 2、hello输出了2个,world输出了1个(因为第2个hello输出完,主线程就...阅读全文

博文 2015-05-02 21:28 baiyuxiong

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

简单来说:协程十分轻量,可以在一个进程中执行有数以十万计的协程,依旧保持高性能。 进程、线程、协程的关系和区别: 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。 堆和栈的区别请参看:http://www.cnblogs.com/ghj1976/p/3623037.html 协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任。 执行协程只需要极少的栈内存(大概是4~5KB),默认情况下,线程栈的大小为1MB。 goroutine就是一段代码,一个函数入口,以及在堆...阅读全文

博文 2015-07-23 11:33 nop4ss

Golang的GC信息

一、GC信息的信息收集 设置环境变量GODEBUG=gctrace=1。 使用方法,如果程序为myserver。正常的启动方法为./myserver,如果需要收集GC信息启动方式如下GODEBUG=gctrace=1 ./myserver。 二、GC信息分析 gc5(6): 11+12+357+77 us, 0 -> 1 MB, 4294 (5261-967) objects, 67/2/0 sweeps, 6(115) handoff, 6(9) steal, 170/56/5 yields gc5(6):表示第5次GC,共有6个线程参与GC。 11+12+357+77 us:表示停止各个goroutine花费时间是11us,释放标记对象所有时间为12us,扫描标记可回收对象花费时间为25...阅读全文

go语言实现线程池

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

博文 2015-07-22 15:32 wolfred7464

Go语言中的管道(Channel)总结

管道(Channel)是Go语言中比较重要的部分,经常在Go中的并发中使用。今天尝试对Go语言的管道来做以下总结。总结的形式采用问答式的方法,让答案更有目的性。 Q1.管道是什么? 管道是Go语言在语言级别上提供的goroutine间的**通讯方式**,我们可以使用channel在多个goroutine之间传递消息。channel是**进程内**的通讯方式,是不支持跨进程通信的,如果需要进程间通讯的话,可以使用Socket等网络方式。 以上是管道的概念,下面我们就看下管道的语法。 Q2.管道的语法? 整个Go语言的语法都比较简洁,管道也不例外,其语法如下所示: 在此应当注意,管道是类型相关的,即一个管道只能传递一种类型的值。管道中的数据是先进先出的。 1 // 声明方式,在此ElemType...阅读全文

博文 2015-03-25 13:47 yetuweiba

goroutine与调度器

我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine。goroutine就是Go语言提供的一种用户态线程,当然这种用户态线程是跑在内核级线程之上的。当我们创建了很多的goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都使用cpu,并且是尽可能公平的使用cpu资源。 这个调度器的原理以及实现值得我们去深入研究一下。支撑整个调度器的主要有4个重要结构,分别是M、G、P、Sched,前三个定义在runtime.h中,Sched定义在proc.c中。 Sched结构就是调度器,它维护有存储M和G的队列以及调度器的一些状态信息等。 M代表内核级线程,一个M就是一个线程,gorouti...阅读全文

go语言示例-Timer计时器的用法

计时器用来定时执行任务,分享一段代码: package main import "time" import "fmt" func main() { //新建计时器,两秒以后触发,go触发计时器的方法比较特别,就是在计时器的channel中发送值 timer1 := time.NewTimer(time.Second * 2) //此处在等待channel中的信号,执行此段代码时会阻塞两秒 <-timer1.C fmt.Println("Timer 1 expired") //新建计时器,一秒后触发 timer2 := time.NewTimer(time.Second) //新开启一个线程来处理触发后的事件 go func() { //等触发时的信号 <-timer2.C fmt.Print...阅读全文

博文 2015-03-03 09:03 baiyuxiong

由Go语言并发模型想到游戏服务器并发

这段时间看了一些Go语言相关的东西,发现Go语言的最大特性并发模型类似于C++里面的线程池,正好我们项目服务器也是用的线程池,记录下。 Go语言的并发单位是语言内置的协程,使用关键字go+函数创建一个新的协程,新创建的协程会自动加入到协程调度上下文的等待调度队列,一个协程调度上下文对应一个线程,一个协程调度上下文对应多个协程。新加入的协程会动态负载到各个调度上下文,如果所有调度上下文的平均负载较高时,总调度器会自动创建新的线程和对应的调度上下文用于工作。整体上看,是N个线程:N个调度上下文:M个协程的关系。 我们项目服务器线程架构使用boost::threadpool作为底层,按照配置设定的线程数量启动threadpool,驱动所有Invoker单元,各个Invoker再驱动持有自己的Ser...阅读全文

Golang基于TCP/IP的简单聊天程序

Server.go package main import ( "fmt" "io" "net" "os" "strings" ) func main() { addr, err := net.ResolveTCPAddr("tcp", ":4040") checkErr(err) listen, err := net.ListenTCP("tcp", addr) checkErr(err) fmt.Println("Start server...") for { conn, err := listen.Accept() checkErr(err) go Handle(conn)// 每次建立一个连接就放到单独的线程内做处理 } } const BufLength = 128 var use...阅读全文

博文 2014-12-24 20:01 lucifd

AlphaGo的论文的译文,关于深度神经网络,蒙特卡洛树搜索:Mastering the game of Go with deep neural networks and tree search

前言: 围棋的英文是 the game of go,标题翻译为:《用深度神经网络和树搜索征服围棋》。译者简介:大三,211,计算机科学与技术专业,平均分92分,专业第一;英文水准:托福 103分,GRE v158 + q167 + AW3.5。为了更好地翻译此文,笔者查看了很多资料。笔者翻译此论文已尽全力,不足之处希望读者指出。 在AlphaGo的影响之下,全社会对人工智能的关注进一步提升。在笔者考完GRE的当天,3月12日,AlphaGo 第三次击败李世石。在3月15日总比分定格为4:1,随后AlphaGo的围棋排名世界来到第二。 论文的英文原文点击这里拜读 编者按:吐槽CSDN的后台服务器,在我用LaTeX编写的公式结尾都加上了一个“|”,比如:公式公式。这真是一个醉人的Bug。2014...阅读全文

golang 线程与通道

首先我们来看线程,在golang里面也叫goroutine 在读这篇文章之前,我们需要了解一下并发与并行。golang的线程是一种并发机制,而不是并行。它们之间的区别大家可以上网搜一下,网上有很多的介绍。 下面我们先来看一个例子吧 import( "fmt" ) funcmain(){ go fmt.Println("1") fmt.Println("2") } 在golang里面,使用go这个关键字,后面再跟上一个函数就可以创建一个线程。后面的这个函数可以是已经写好的函数,也可以是一个匿名函数 funcmain(){ vari=3 go func(a int) { fmt.Println(a) fmt.Println("1") }(i) fmt.Println("2") } 上面的代码就创...阅读全文

博文 2015-01-21 10:43 niechaoya

谈谈并发编程中的协程

高并发编程里多线程(进程)的弊端 其实从著名的 C10K 问题的时候, 就谈到了高并发编程时, 采用多线程(或进程)是一种不可取的解决方案, 核心原因是因为线程(或进程)本质上都是操作系统的资源, 每个线程需要额外占用1M或者2M的内存空间, 所以2G内存,能承受的线程数差不多只能到1k这个量级。 而且线程的调度由操作系统调度, 当线程或者进程数到达一定量级的时候, 据有人试验的结果是并发的线程数到达1k以上后, 操作系统基本上就已经不堪重负,调度不过来了。 事件驱动 已知多线程已经无法解决高并发问题, 所以才有了异步IO,事件驱动等概念来解决高并发编程。 很典型的就是 Node.js ,传说中的事件驱动, 其实就是在底层使用了 libuv 然后通过各种回调函数来注册事件, 当事件触发的时候...阅读全文

Golang: 利用 channel (管道) 技术多线程下载图片

利用 channel (管道) 技术多线程下载图片. package main import ( "io/ioutil" "log" "net/http" "os" "regexp" //"strconv" "strings" "sync" ) var urlist = [...]string{"http://stock.591hx.com/article/2014-12-03/0000850005s.shtml"} var album chan string var w sync.WaitGroup var dir string func main() { dir = "tmp_chenjo/" err := os.Mkdir(dir, 0777) if err != nil { isex...阅读全文

博文 2015-01-18 kanglecjr

golang实现AT命令的发送(Windows版)

问题的提出 由于golang的微线程(goroutines)的特征,实现同时交互进行的任务变得自然而容易。一直想实现一个能对手机进行自动发送AT的程序,而实现相应的自动化测试。现在用golang来偿试一下。 问题所依赖的库 使用golang来实现的对串口的操作的库从网上找到了一个,就不用重新发明轮子啦。https://github.com/huin/goserial 在Windows下使用的文件如下: serial.go /* Goserial is a simple go package to allow you to read and write from the serial port as a stream of bytes. It aims to have the same API...阅读全文

博文 2012-11-15 10:58 huangliujing

关于 许式伟谈Go Erlang并发编程差异

写在开头: 这篇文章是ECUG2014年七牛CEO许式伟的演讲稿。这篇文章很详细的分析了Go和 Erlang在实现并发编程的差异,但是有些内容可能因为作者本人个人情感的一些原因有些出入导致了知乎上的一些讨论,http://www.zhihu.com/question/27465406,这种讨论甚至激烈的争辩是无法避免的,因为捍卫者需要站出来维护他们正在使用的兵器。关于这种争辩,在其他编程领域也有许多包括C++和java的争论,C和C++的争论等。为了从多个角度对知识有一个了解,后面我附上了张虎的在知乎上的回答,因为他们正在使用erlang。 但是作为一个很系统的技术层面上的一个分析比较已经很详细了。 By lingtao. ----------------------------------...阅读全文

博文 2015-05-01 11:35 u011321908

关于《我为什么放弃Go语言》的讨论

CSDN 上有一篇文章 [《我为什么放弃Go语言》](http://blog.csdn.net/liigo/article/details/23699459),在 golang-china 讨论组引发了一些讨论,为了便于墙内 gopher 们阅读,选择了一些有价值的评论发在这里。(重点关注 minux 大神的回复) 刘鑫: 无所谓啦,本来就是个工具语言,没必要人人都去拜。对自己好用,就用实际行动来支持,这不比打嘴炮好多了。从来没有一门编程语言能让所有人都满意。何况人家文章里有些东西写的还是挺有道理。特别是社区的态度问题。去年我说某IDE的插件不能识别不可达的逻辑,一大群人出来教育我说go语言本来就这么设计的。只有巢鹏一个人的博客上写着这是go官方2009年就明明白白列出来的一个...阅读全文

Node.js性能初窥-计算性能(Qt/C++,Golang,Node.js)

文地址:http://blog.csdn.net/slug302/article/details/14521261 大家都知道Node.js的单进程非阻塞模型适合于任务密集性(I/O)而不是计算密集型.那么到底有多不适合计算呢?下面做一个简单的测试. 测试硬件平台如下: 电脑型号 苹果 Macmini6,2 Lunch Box 操作系统 Windows 8 Enterprise 64位 ( DirectX 11 ) 处理器 英特尔 第三代酷睿 i7-3615QM @ 2.30GHz 四核 内存 16 GB ( 三星 DDR3 1600MHz ) 主硬盘 APPLE HDD HTS541010A9E662 ( 1 TB ) 软件平台: Node.js 0.10.21 Qt5.2 beta1 G...阅读全文

博文 2014-12-06 10:20 mywcyfl

RUST叫系统编程语言,而GO是网络编程语言

用GO你必须要搞清楚一点,GO不是面向CPU密集计算的,而是面向IO密集计算的!!!RUST才是面向CPU密集计算的语言,所以RUST叫系统编程语言,而GO是网络编程语言。GO跟JAVA的Spring是一个层面上的东西。对于那些无法同时操纵高级语言Python Ruby ...和系统语言比如C C++的中间类型的人,才会用JAVA GO。 但是别以为你用JAVA GO就能写出速度更快的IO,IO的速度跟语言的编译速度根本就没有多少影响。现在最快速的IO基本是多路复用而不是多线程。对于多路复用,语言的CPU计算根本无足轻重。 参考:http://www.oschina.net/news/62867/go-jav...阅读全文

博文 2015-05-29 16:31 findumars

一个java和golang(go语言)通信的例子。

go语言是一个系统级语言,好处非常多。虽然是一个静态编译型语言,但可以像动态语言一样写程序,语言本身可以提供编写应用程序所需的基本组件,而不用引入第三方的包。如果了解c++、java、python等,会对其简洁和强大有更深的认识,c++实在过于繁琐,java也没有想象的简单,python的效率和go不是一个数量级的。那么多的特性,印象最深的就是其对并发的支持,优雅而高效。一般情况下并发通过进程、线程、基于异步IO的回调来实现,进程和线程不能大量的创建,如超过1万个系统资源就不堪重负了,回调可以尽可能少的创建线程,但用法不太符合自然习惯,比如boost 的asio就是一个很好的处理并发的框架,使用得当可以写出高效优雅的服务器程序。而go则在语言级别支持协程,协程是一种轻量级线程,可以创建百万个...阅读全文

博文 2013-10-16 22:10 qfsun

对golang服务器开发模式的一些思考

多线程+同步阻塞模型 在我们的游戏项目中使用的golang服务器开发方式如下 1.多线程逻辑 2.同步阻塞. 也就是说, 每个人一个线程(goroutine), io线程=逻辑线程 这种方式的优点: 1. 同步阻塞方式与人的思维方式类同 2. 逻辑处理性能有一定提升 在大规模使用这种模式编写逻辑后, 我们发现了这种模式只有1个缺点: 编写者需要处理多线程关系 但这本身确实直接致命的, 回想C++时代, 多线程处理时, 调试重现的困难… 脑补景象太惨不敢直视 单线程+异步多进程模型 在C++时代, 我曾经编写过一套asio的C++服务器框架. 采用io多线程, 逻辑单线程, 依赖着C++高性能的优势, 让开发便捷简单且无需关心线程问题. 那么到了golang时代, 为什么不能试下单线程异步多进...阅读全文

博文 2015-10-17 17:57 zangao

Rob Pike谈Google Go:并发,Type System,内存管理和GC

1. Rob,你创建了Google Go这门语言。什么是Google Go?能简明扼要的介绍一下Google Go吗? 我还是讲讲为什么要创建这门语言吧,和你的问题稍有些不同。我在Google做了一个有关编程语言的系列讲座,在Youtube上有,谈及了我早期所写的一个语言,叫做Newsqueak,那是八十年代的事,非常早。在做讲座期间,我开始思考为什么Newsqueak中的一些想法在我现在以C++为主的工作环境中无法使用。而且在Google我们经常要构建非常大的程序,光构建就要花很多时间,对依赖的管理也有问题,由于链接了本来并不需要的东西,二进制程序包变得很大,链接时间很长,编译时间也很长,而且C++的工作方式有点古老,其底层实际上C,C++已经有三十年的历史了,而C则更是有四十年了。用现今...阅读全文

博文 2014-10-15 14:59 zhoukuo

[北京]Golang游戏服务器工程师

北京钛核互动信息技术有限公司成立于2014年11月,创始人团队都是来自于Glu Mobile, Gameloft等顶尖手游公司。在游戏行业打拼了10年以上,擅长高品质精品游戏开发。开发过大量精品手机游戏、Console游戏和网游。公司坚信以人为本,以顶级的人才需要顶级的回报为目标,营造一个有激情的宽松的游戏开发环境,希望能够让游戏人才能够发挥自己的热情和潜力。 http://www.tuicool.com/articles/uEfEJf 服务器将会使用弹性云自动伸缩架构,在这里你将能够学习并开发具有国际最先进的云架构游戏服务器方案。我们招聘具有创新精神的工程师,敢创新、思维严谨、勇于承担。 **基本能力要求:** 1. 热爱玩游戏,热爱开发游戏。具备足够的游戏常识;...阅读全文

测试golang中的多核多线程

"并发 (concurrency)" 和 "并行 ( parallelism)" 是不同的。在单个 CPU 核上,线程通过时间片或者让出控制权来实现任务切换,达到 "同时" 运⾏多个任务的⺫的,这就是所谓的并发。但实际上任何时刻都只有一个任务被执行,其他任务通过某种算法来排队。多核 CPU 可以让同⼀进程内的 "多个线程" 做到真正意义上的同时运,它们之间不需要排队 (依然会发生排队,因为线程数量可能超出 CPU 核数量,还有其他的进程等等。这里说的是一个理想状况),这才是并行。除了多核,并行计算还可能是多台机器上部署运行。 package main import ( "fmt" "runtime" ) func test(c chan bool, n int) { x := 0 for i...阅读全文

博文 2014-11-29 21:48 zhjih123

Golang中log与fmt区别

关于使用log与使用fmt的区别 最初的就是直接打印出来,之后一点点升级,比如加上输出的时间,加上goroutine之间的并发操作(打印信息并不能一定按照你规定好的顺序输出来 每次输出的顺序可能会不同),按照不同的日志级别进行打印 。。。加上打印以及转存,因此就需要专门的log包来记录程序的信息。 想象一下,一个很大的项目有很多的输出信息,要是输出信息前面没有加上日期的话,debug起来几乎是难以想象的,因为不可能一直盯着屏幕来对信息进行监控。 因此采用log来代替fmt的原因主要有一下几个方面: 添加了输出时间 线程安全 方便对日志信息进行转存,形成日志文件 关于logger的基本结构,可以参考这个博客:http://gotaly.blog.51cto.com/8861157/140690...阅读全文

博文 2015-07-04 08:40 Goden

golang设计模式的一些看法

golang设计模式的一些看法 对于c、c++来讲,设计的对象存在着这几个问题 1、 对象是死的,只有自己的属性,行为(函数)。没有可以自己独立执行的机制 2、 对象是存活的,有自己的属性,行为(函数),还有独立执行的活动(自己独立的线程)。但由于系统的限制,这种对象数量不能过多(线程数量不能太多)。 3、 对象是半存活的,有自己的属性,行为,没有独立的执行活动(没有自己独立的线程)。需要借助于其他对象的线程调度。 以上是c、c++语言的一些限制。其他语言不是熟悉,不进行评判。但大多数也是类似的。 那么对于golang语言来讲,设计的对象可以是 存活的,每个对象,有自己的属性,有自己的行为,也有自己的活动(通过协程来实现)。那么这样来讲,golang就可以实现对对象的完整模拟实现。就犹如我们...阅读全文

谈谈go语言编程的并发安全

问题起因 在分布式存储开源项目 Weed-FS 中, 我发现了一个地方非并发安全(not concurrency-safety), 所以提交了一个 Weed-FS-PullRequest-75 来进行加锁保护。 简化这个问题如下: 当有一个变量, 有一个 goroutine 会对它进行写操作, 其他 goroutine 对它进行读操作。 是否需要对这个变量进行加锁保护。 我觉得不同goroutine并发读写同一个变量, 需要加锁, 这应该是天经地义的常识。 但是这个 PullRequest 居然出乎意料的被作者反驳了。 作者的理由是: 只有一个 goroutine 在写,其他 goroutine 在读,不需要加锁。 但是这样的观点我实在无法苟同, 因为在我的 C/C++ 开发经验中,这是必然...阅读全文

libgo 2.0发布

libgo 是一个使用 C++ 编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库。 设计之初是为高并发分布式Linux服务端程序开发提供底层框架支持,可以让链接进程序的同步的第三方库变为异步库,不影响逻辑的前提下提升其性能。 目前支持两个平台: Linux (GCC4.8+) Windows (Win7、Win8、Win10 x86 and x64 使用VS2013/2015编译) 使用libgo编写并行程序,即可以像golang一样开发迅速且逻辑简洁,又有C++原生的性能优势。 1.提供golang一般功能强大协程,基于corontine编写代码,可以以同步的方式编写简单的代码,同时获得异步的性能 2.支持海量协程, 创建100万个协程只需使用2GB内存 3.允许用...阅读全文

博文 2016-01-25 16:45 yyzybb

Go并发编程基础(译)

文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖: 运行期并发线程(goroutines) 基本的同步技术(管道和锁) Go语言中基本的并发模式 死锁和数据竞争 并行计算 在开始阅读本文之前,你应该知道如何编写简单的Go程序。如果你熟悉的是C/C++、Java或Python之类的语言,那么 Go语言之旅 能提供所有必要的背景知识。也许你还有兴趣读一读 为C++程序员准备的Go语言教程 或 为Java程序员准备的Go语言教程。 1. 运行期线程 Go允许使用go语句开启一个新的运行期线程,即 goroutine,以一个不同的、新创建的goroutine来执行一个函...阅读全文

博文 2015-05-20 youngsterxyf

Go并发编程(四)

并发基础 多进程 多线程基于回调的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程的最大优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭,而线程和进程通常最多也不能超过1万个。这也是协程也叫轻量级线程的原因。多数语言在语法层面并不直接支持协程,而是通过库的方式支持,但用库的方式支持的功能也并不完整,比如仅仅提供轻量级线程的创建、销毁与切换等能力。如果在这样的轻量级线程中调用一个同步 IO 操作,比如网络通信、本地文件读写,都会阻塞其他的并发执行轻量级线程, 从而无法真正达到轻量级线程本身期望达到的目标。 Go 语言在语言级别支持轻量级线程,叫goroutine。Go 语言标准库提供的所有系统调用操作(当然也包括所有同步 IO 操作),都会出让 CPU 给其他g...阅读全文

博文 2015-01-22 09:59 anbylau2130

go语言怎样避免垃圾回收,详见28条

Rob Pike谈Google Go:并发,Type System,内存管理和GC 1. Rob,你创建了Google Go这门语言。什么是Google Go?能简明扼要的介绍一下Google Go吗? 我还是讲讲为什么要创建这门语言吧,和你的问题稍有些不同。我在Google做了一个有关编程语言的系列讲座,在Youtube上有,谈及了我早期所写的一个语言,叫做Newsqueak,那是八十年代的事,非常早。在做讲座期间,我开始思考为什么Newsqueak中的一些想法在我现在以C++为主的工作环境中无法使用。而且在Google我们经常要构建非常大的程序,光构建就要花很多时间,对依赖的管理也有问题,由于链接了本来并不需要的东西,二进制程序包变得很大,链接时间很长,编译时间也很长,而且C++的工作方...阅读全文

博文 2015-03-28 23:22 jackyZ

也谈并发与并行

也谈并发与并行 六 23 bigwhite技术志 Concurrency, Go, Go1.5, Golang, Google, Gopher, goroutine, parallelism, RobPike, 并发, 并行, 线程, 编程语言, 调度 No Comments 在一般人的眼中,“并行”就是并行,即你干你的,我干我的,两个“并行”的执行过程可能是两条毫无瓜葛的平行线,也可能是有交叉,但瞬即分开的两条线。不 过在程序员的世界里,有关“并行”的概念却有两个单词:Concurrency和Parallelism,对应的比较主流的中文翻译为并发 (Concurrency)和并行(Parallelism)。 之前一直使用C、Python进行Coding,对Concrrency和Parall...阅读全文

Java、Scala和Go语言多线程并发对比测试结果和结论

前面的内容请看:Java、Scala和Go语言多线程并发对比测试。 相关的代码下载:http://qinhui99.itpub.net/resource/2570/31876 测试结果和结论 统计1~N个自然数里面有多少个质数,并记录所花费时间。相同的N,时间越少性能越好。 AMD 双核 2.8G ,4G内存 winxp java+conc java+AKKA1.3 java+AKKA2.0 Scala+AKKA1.3 Scala+AKKA2.0 Go+goroutine 1-N 单位:秒 1000000 0.64 1.14 0.63 1.05 0.65 0.617 2000000 1.71 2.08 1.58 2.05 1.68 1.63 3000000 3.05 3.28 2.79 3....阅读全文

博文 2012-08-17 12:31 Xiao_Qiang_

Go RPC Benchmark

这篇完成得太折腾了,为了更好的展示benchmark的一系列结果数据,我必须得找个软件将数据进行图表化。以前在windows上基本都用execel画曲线图、柱状图等,但在linux/mac上却找不到顺手的工具了。我也使用过gnuplot,这货不知道是太专业,还是太古老的原因,始终用得不顺手、不开心。于是,我就决定自己先用Go和chart.js库折腾了一个goplot工具来绘制图表,然后再才开始写这篇博客。 有人可能会说我又在折腾轮子了,确实是折腾了一个轮子。话说,这又怎么样呢?作为一个程序员,最大的优势就是自己用得不开心的工具,可以自己动手完善、甚至写一个新的。我认为一个geek程序员首先就是要学会不断的装备自己的工具库。不扯废话了,回归正题。 测试维度 这次benchmark主要以下两个维...阅读全文

博文 10 September 2013 skoo

Golang后台开发初体验

补充反馈 slice 既然聊到slice,就不得不提它的近亲array,这里不太想提值类型和引用类型的概念(个人觉得其实都是值类型),golang的array其实可以假想为C的struct类型,只是struct通过变量名来访问成员(如xxx.yyy),而array通过下标来访问成员(如xxx[3]),具体内存布局如下图所示: 图 1 golang的array内存布局 显然golang的array灵活性比较差,长度固定,这才有了slice,概念上有点类似于STL的vector,但是具体实现上还是有差距的,具体内存布局如下图所示: 图 2 golang的slice内存布局 slice类型存在len和cap的概念(与vector类似),这里有一点需要澄清:与vector不一样,slice的len并...阅读全文

博文 2014-07-13 16:40 cszhouwei

成都地区招聘golang

成都魔方在线数据中心诚聘 golang工程师 : 1、计算机相关专业专科及以上学历,具有3年及以上开发工作经验; 2、熟悉golang语言编程,掌握多线程、socket等相关技术; 3、具有高负载、高并发开发设计经验值者优先考虑; 4、熟悉MySql、Mongo等数据库编程; 5、熟悉Linux服务器,有丰富的C/C++编程经验; 6、拥有扎实的计算机编程能力,尤其在数据结构、算法和代码、软件设计方面有较好的功底; 7、最重要的是有责任心,对技术有激情、有追求,富于技术创新精神,勇于解决技术难题; 8、C/C++工程师具有同等工作经验也可以考虑; 9、研究生以上学历可适当放宽其他要求; 职位描述: 1、参与公司平台分布式云搭建 ...阅读全文

golang多核设置

单核执行如果for前面或者中间不延迟,主线程不会让出CPU,导致异步的线程无法执行, 从而无法设置flag的值,从而出现死循环 实例代码: package main import ( "fmt" "runtime" _ "time" ) var ( flag = false str string ) func foo() { flag = true str = "setup complete!" } func main() { runtime.GOMAXPROCS(1) go foo() //time.Sleep(1 * time.Second) for { if flag { break } } fmt.Println(str) } 解决办法:1、for中间或者前面加延迟 2、runtim...阅读全文

golang 爬虫(二)

通用的爬虫原理示意图: 具体实现过程: 1、开一个协程从待抓取url中获取url,进行网页获取,网页解析,然后入库; 2、开另一个协程从已抓取url中获取url,进行获取其他url并且放入待抓取url队列中; 网页解析 在golang中,解析网页有几个比较好用的第三方库。比如:github.com/opesun/goquery,github.com/PuerkitoBio/goquery等等。 github.com/PuerkitoBio/goquery功能强大,但在使用的时候,编译不过,当时比较懒就不用了。而使用github.com/opesun/goquery,该插件是在解析html节点时,使用jq类似的语法。下面介绍几个列子: content,err:=goquery.ParseUrl...阅读全文

博文 2016-05-27 14:18 kelindame

并发之痛 Thread,Goroutine,Actor

编者按:本文是王渊命在 2 月 27 日 Gopher 北京聚会演讲基础上整理而成,进行了一些补充以及调整,投稿给高可用架构首发。转载请注明来自高可用架构公众号「ArchNotes」。王渊命,团队协作 IM 服务 Grouk 联合创始人及 CTO,技术极客,曾任新浪微博架构师、微米技术总监。2014 年作为联合创始人创立团队协作 IM 服务 Grouk,长期关注团队协作基础工具和研发环境建设,Docker 深度实践者。聊这个话题之前,先梳理下两个概念,几乎所有讲并发的文章都要先讲这两个概念:并发(concurrency) 并发的关注点在于任务切分。举例来说,你是一个创业公司的CEO,开始只有你一个人,你一人分饰多角,一会做产品规划,一会写代码,一会见客户,虽然你不能见客户的同时写代码,但由于...阅读全文

介绍Go竞争检测器

文连接http://blog.golang.org/race-detector 介绍: 竞争条件是最狡诈的、最难以找到的编程错误。通常,在代码被布置到生产环境很久以后,它们才会出现并且造成奇怪的、神秘的错误。尽管Go语言的并发机制使得更容易的编写出干净的并发代码,依然无法避免竞争条件的出现。小心、勤勉以及测试是必须的。工具也可以提供帮助。 我们很高兴的宣布Go1.1包含了一个竞争检测器,一个全新的工具,用于在Go代码中找到竞争条件。该工具当前在Linux,OS X 和Windows平台可用,只要CPU是64位的x86架构。 竞争检测器基于C/C++的ThreadSanitizer 运行时库,该库在Google内部代码基地和Chromium找到许多错误。这个技术在2012年九月集成到Go中,从...阅读全文

博文 2013-11-01 23:30 fighterlyt

golang技术随笔(二)理解goroutine

进程、线程和协程 要理解什么是goroutine,我们先来看看进程、线程以及协程它们之间的区别,这能帮助我们更好的理解goroutine。 进程:分配完整独立的地址空间,拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程的切换只发生在内核态,由操作系统调度。 线程:和其它本进程的线程共享地址空间,拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程的切换一般也由操作系统调度(标准线程是的)。 协程:和线程类似,共享堆,不共享栈,协程的切换一般由程序员在代码中显式控制。 进程和线程的切换主要依赖于时间片的控制(关于进程和线程的调度方式,具体可参看这篇文章:http://blog.chinaunix.net/uid-20476365-id-1942505.html),而协程的切换则主要依赖于自身,...阅读全文

博文 2015-03-05 21:20 justaipanda

Go 语言运行时环境变量快速导览

文: http://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables Go 语言运行时环境变量快速导览 介绍: Go Runtime除了提供:GC, goroutine调度, 定时器,network polling等服务外, 还提供其它一些工具设施,用于开启额外的调试输出, 或是改变Go Runtime自身的一些行为。这些工具设施由传给Go program的一些环境变量控制, 本文主要讲述它们。 GOGC GOGC 是Go Runtime最早支持的环境变量,甚至比GOROOT还早,几乎无人不知。GOGC 用于控制GC的处发频率, 其值默认为100, 意为直到自上次垃圾回收后heap...阅读全文

博文 2016-03-11 06:51 htyu_0203_39

Go语言内存分配器设计

Go语言的整个内存管理子系统主要由两部分组成——内存分配器和垃圾收集器(gc)。十一小长假期为了避开我泱泱大国的人流高峰,于是在家宅了3天把Go语言的内存分配器部分的代码给研究了一番,总的来说还是非常酷的,自己也学到了不少的东西,就此记录分享一下。整个内存分配器完全是基于Google自家的tcmalloc的设计重新实现了一遍,因此,想看看Go语言的内存分配器实现的话,强烈建议先读一读tcmalloc的介绍文档,然后看看Go runtime的malloc.h源码文件的注释介绍,这样基本就大概了解Go语言内存分配器的设计了。 Go的内存分配器主要也是解决小对象的分配管理和多线程的内存分配问题。(后面提到的内存分配器都是指代的Go语言实现的内存分配器)。内存分配器以32k作为对象大小的定夺标准,小...阅读全文

简洁的GO语言,未来的语言趋势?

它的好其实也就两个字——简洁! 看很多朋友的留言都觉得这些“少个括号、少个分号”之类的东西没什么意义,真的吗?问题是,既然可以没有,为什么非得有?既然能够少打一个字符,为什么多打了还挺开心?还觉得天经地义?这里简单一点,那里简单一点,总的来说是不是就简单了很多?这里的设计简洁一点,那里简洁一点,是否整体就是紧凑高效? 很多东西,要整体去体会,才能感觉到真正的强大。没有前面这些语法上的各种“看起来没什么用”的支持,怎么能做到后面提到的那些设计上的简洁? 我坚信,少就是多,简单就是强大,不能减一分的设计才是真正的好设计! 简洁的变量声明和赋值 拿最简单的声明变量和赋值来看,下面这一句完成了声明类型到赋值,最后还有那个常见的分号作为语句的结束。 var i int = 10; 这个一点都不简洁对吧...阅读全文

博文 2015-01-08 08:36 u013628152

一个go语言实现的短链接服务

一个go语言实现的短链接服务 首先,博客转移到 wusay.org 了,去年没交费,博客都没了。。。刚刚恢复过来,以前的文章没了,慢慢补吧。 什么是短链接服务 大家都用过新浪微博的短连接吧,就是t.cn后面一串不知道是什么的数,然后跳转到一个新页面去,具体什么是短连接请大家自行脑补,在这里,目前有很多提供短连接的地方,比如狼厂的短连接服务,还有提供很多短链接的在线服务,比如这个,能生成很多地方的短连接。 巴特,作为一个程序员,我们不止需要一个端链接服务,我需要自己实现一个短连接服务,因为一般的公共的短连接都有token要求,每天生成的链接也有限制,当你需要生成大量短连接的时候就比较麻烦了。 所以,我实现了一个短连接服务。 短连接的原理 很多人一定想的是短连接是通过一定的算法将长链接变成短连接...阅读全文

博文 2015-06-16 18:46 ygrx