基于goroutine的web并发编程的研究与应用
2016-01-18陈伟颖李艳平翟玥
陈伟颖++李艳平++翟玥
摘要:Goroutine是Go语言提出的轻量级线程,可应用于需要高并发的场景中。该文对Goroutine并发编程及其所涉及到的相关知识和编程基础进行了讨论,对其效率进行了对比和分析,并实现了社交网站服务端语言层面的应用。基于Beego的社交网站所涉及需要进行高并发编程的部分主要包括推送功能和数值计算,该文涉及了相应的应用。
关键词:GO语言 Goroutine;并发 web
中图分类号:TP311 文献识别号:A 文章编号:1009-3044(2015)33-0052-03
Research and Application of Goroutine Concurrent Programming Based on Web
CHEN Wei-ying, LI Yan-ping, ZHAI Yue
(School of Computer Science of Beijing Information Science & Technology University, Beijing 100101,China)
Abstract: Goroutine is a lightweight thread of Go language, which can be applied to the scene of high concurrency. In this paper, the Goroutine concurrent programming and its related knowledge and programming are discussed. The efficiency is compared and analyzed, and the application of the social web server is realized. Beego based social networking sites involved in the need for high concurrent programming part of the main including the push function and numerical calculation, this paper relates to the corresponding application.
Key words: Golang Goroutine; concurrency web
对于用户量成百上千万的web应用来说,如何处理高并发的访问和操作是一个很大的挑战。一方面,大部分网络应用程序都被设计成客户/服务器模式, 目的是让服务器为客户提供一些特定的服务。服务器分为重复型服务器和并发型服务器, 前者一个时刻只能处理一个请求, 其他客户的请求暂时放在队列里,等待上一个请求处理完成后再进行处理;后者为每个客户请求产生一个新的线程为其服务, 而主线程继续等待其他客户的请求;另一方面,人们试图通过其他手段对服务器业务处理效率进行提升。
在本文中我们讨论的是在Go语言的Goroutine在语言级别进行的并发编程在web方面应用。
1 并发概念阐述
并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
并发包含着几种主流的实现模型:多进程、多线程、基于回调的非阻塞/异步IO、协程,能更客观地表现问题模型,可以充分利用CPU核心的优势,提高程序的执行效率,能充分利用CPU与其他硬件设备固有的异步性。
2 Goroutine并发机制的研究
2.1 设计原理
Go语言并发编程的核心是:同步通信;其关键字包括:Goroutine和Channel。
Go语言的并发体系是C.A.R Hoare在1978年提出的CSP(Communication Sequential Process,通信顺序进程),在该语言中,一个并发系统由若干并行运行的顺序进程组成,每个进程不能对其他进程的变量赋值。进程之间只能通过一对通信原语实现协作:Q->x表示从进程Q输入一个值到变量x中;P<-e表示把表达式e的值发送给进程P。当P进程执行Q->x,同时Q进程执行P<-e时,发生通信,e的值从Q进程传送给P进程的变量x。后来出现的实用编程语言OCCAM即以CSP为基础发展而成。
2.2 Goroutine机制简述
Goroutine语法为:go fun(),本质上是一个线程,但规模比线程要小,体现在底层是五六个线程。它由Go运行时初始化并调度,操作系统根本看不到Goroutine的存在。所有的goroutines都是活着的,并且以多路复用的形式运行于操作系统为应用程序分配的少数几个线程上。创建一个Goroutine并不需要太多内存,只需要8K的栈空间 。它们根据需要在堆上分配和释放内存以实现自身的增长。其设计原则为:不要通过共享来通信,而要通过通信来共享。
Goroutine运行在相同的地址空间,因此访问共享内存需要做好同步,Go语言为此提供的通信机制为Channel。一般channel的声明形式为var chanName chan ElementType,在应用中,我们常用的方法为count:=make(chan int),必须使用make创建channel。默认情况下,channel接收和发送数据都是阻塞的,这样就不需要现式的lock。
5 结束语
本文分析讨论了Goroutine的背景、语法及其高效性,并应用在了一个社交网站的数值计算和推送功能上。Go语言Goroutine并发处理效能出色,语法简洁,而且生态发展迅速,在开发需要大量并发操作的web应用上是一门值得尝试的语言。
参考文献:
[1] 许式华,吕桂华.Go语言编程[M].北京:民邮电出版社,2012.
[2] 谢孟君.Go Web编程[M].北京:电子工业出版社,2013.
[3] Beego团队.开发文档[EB/OL].[2015].http://beego.me/.
[4] 吴锐.高并发Web系统的设计与应用[J].电脑知识与技术,2013(13).
[5] 姜景根,李祥.基于Java的多线程并发服务器的设计与应用[J].电脑与信息技术,2007,15(1):15.
[6] 梁明刚,陈西曲.Linux下基于epoll+线程池高并发服务器实现研究[J].武汉工业学院学报,2012(3):54.
[7] 金婧,陈家铨,王靖天,等.基于Go 语言及Beego 等开源技术的公务车辆管理系统的设计与实现[J].信息通信,2015(2):140-141.