陳偉穎++李艷平++翟玥
摘要:Goroutine是Go語(yǔ)言提出的輕量級(jí)線(xiàn)程,可應(yīng)用于需要高并發(fā)的場(chǎng)景中。該文對(duì)Goroutine并發(fā)編程及其所涉及到的相關(guān)知識(shí)和編程基礎(chǔ)進(jìn)行了討論,對(duì)其效率進(jìn)行了對(duì)比和分析,并實(shí)現(xiàn)了社交網(wǎng)站服務(wù)端語(yǔ)言層面的應(yīng)用。基于Beego的社交網(wǎng)站所涉及需要進(jìn)行高并發(fā)編程的部分主要包括推送功能和數(shù)值計(jì)算,該文涉及了相應(yīng)的應(yīng)用。
關(guān)鍵詞:GO語(yǔ)言 Goroutine;并發(fā) web
中圖分類(lèi)號(hào):TP311 文獻(xiàn)識(shí)別號(hào):A 文章編號(hào):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
對(duì)于用戶(hù)量成百上千萬(wàn)的web應(yīng)用來(lái)說(shuō),如何處理高并發(fā)的訪(fǎng)問(wèn)和操作是一個(gè)很大的挑戰(zhàn)。一方面,大部分網(wǎng)絡(luò)應(yīng)用程序都被設(shè)計(jì)成客戶(hù)/服務(wù)器模式, 目的是讓服務(wù)器為客戶(hù)提供一些特定的服務(wù)。服務(wù)器分為重復(fù)型服務(wù)器和并發(fā)型服務(wù)器, 前者一個(gè)時(shí)刻只能處理一個(gè)請(qǐng)求, 其他客戶(hù)的請(qǐng)求暫時(shí)放在隊(duì)列里,等待上一個(gè)請(qǐng)求處理完成后再進(jìn)行處理;后者為每個(gè)客戶(hù)請(qǐng)求產(chǎn)生一個(gè)新的線(xiàn)程為其服務(wù), 而主線(xiàn)程繼續(xù)等待其他客戶(hù)的請(qǐng)求;另一方面,人們?cè)噲D通過(guò)其他手段對(duì)服務(wù)器業(yè)務(wù)處理效率進(jìn)行提升。
在本文中我們討論的是在Go語(yǔ)言的Goroutine在語(yǔ)言級(jí)別進(jìn)行的并發(fā)編程在web方面應(yīng)用。
1 并發(fā)概念闡述
并發(fā),在操作系統(tǒng)中,是指一個(gè)時(shí)間段中有幾個(gè)程序都處于已啟動(dòng)運(yùn)行到運(yùn)行完畢之間,且這幾個(gè)程序都是在同一個(gè)處理機(jī)上運(yùn)行,但任一個(gè)時(shí)刻點(diǎn)上只有一個(gè)程序在處理機(jī)上運(yùn)行。
并發(fā)包含著幾種主流的實(shí)現(xiàn)模型:多進(jìn)程、多線(xiàn)程、基于回調(diào)的非阻塞/異步IO、協(xié)程,能更客觀地表現(xiàn)問(wèn)題模型,可以充分利用CPU核心的優(yōu)勢(shì),提高程序的執(zhí)行效率,能充分利用CPU與其他硬件設(shè)備固有的異步性。
2 Goroutine并發(fā)機(jī)制的研究
2.1 設(shè)計(jì)原理
Go語(yǔ)言并發(fā)編程的核心是:同步通信;其關(guān)鍵字包括:Goroutine和Channel。
Go語(yǔ)言的并發(fā)體系是C.A.R Hoare在1978年提出的CSP(Communication Sequential Process,通信順序進(jìn)程),在該語(yǔ)言中,一個(gè)并發(fā)系統(tǒng)由若干并行運(yùn)行的順序進(jìn)程組成,每個(gè)進(jìn)程不能對(duì)其他進(jìn)程的變量賦值。進(jìn)程之間只能通過(guò)一對(duì)通信原語(yǔ)實(shí)現(xiàn)協(xié)作:Q->x表示從進(jìn)程Q輸入一個(gè)值到變量x中;P<-e表示把表達(dá)式e的值發(fā)送給進(jìn)程P。當(dāng)P進(jìn)程執(zhí)行Q->x,同時(shí)Q進(jìn)程執(zhí)行P<-e時(shí),發(fā)生通信,e的值從Q進(jìn)程傳送給P進(jìn)程的變量x。后來(lái)出現(xiàn)的實(shí)用編程語(yǔ)言O(shè)CCAM即以CSP為基礎(chǔ)發(fā)展而成。
2.2 Goroutine機(jī)制簡(jiǎn)述
Goroutine語(yǔ)法為:go fun(),本質(zhì)上是一個(gè)線(xiàn)程,但規(guī)模比線(xiàn)程要小,體現(xiàn)在底層是五六個(gè)線(xiàn)程。它由Go運(yùn)行時(shí)初始化并調(diào)度,操作系統(tǒng)根本看不到Goroutine的存在。所有的goroutines都是活著的,并且以多路復(fù)用的形式運(yùn)行于操作系統(tǒng)為應(yīng)用程序分配的少數(shù)幾個(gè)線(xiàn)程上。創(chuàng)建一個(gè)Goroutine并不需要太多內(nèi)存,只需要8K的??臻g 。它們根據(jù)需要在堆上分配和釋放內(nèi)存以實(shí)現(xiàn)自身的增長(zhǎng)。其設(shè)計(jì)原則為:不要通過(guò)共享來(lái)通信,而要通過(guò)通信來(lái)共享。
Goroutine運(yùn)行在相同的地址空間,因此訪(fǎng)問(wèn)共享內(nèi)存需要做好同步,Go語(yǔ)言為此提供的通信機(jī)制為Channel。一般channel的聲明形式為var chanName chan ElementType,在應(yīng)用中,我們常用的方法為count:=make(chan int),必須使用make創(chuàng)建channel。默認(rèn)情況下,channel接收和發(fā)送數(shù)據(jù)都是阻塞的,這樣就不需要現(xiàn)式的lock。
5 結(jié)束語(yǔ)
本文分析討論了Goroutine的背景、語(yǔ)法及其高效性,并應(yīng)用在了一個(gè)社交網(wǎng)站的數(shù)值計(jì)算和推送功能上。Go語(yǔ)言Goroutine并發(fā)處理效能出色,語(yǔ)法簡(jiǎn)潔,而且生態(tài)發(fā)展迅速,在開(kāi)發(fā)需要大量并發(fā)操作的web應(yīng)用上是一門(mén)值得嘗試的語(yǔ)言。
參考文獻(xiàn):
[1] 許式華,呂桂華.Go語(yǔ)言編程[M].北京:民郵電出版社,2012.
[2] 謝孟君.Go Web編程[M].北京:電子工業(yè)出版社,2013.
[3] Beego團(tuán)隊(duì).開(kāi)發(fā)文檔[EB/OL].[2015].http://beego.me/.
[4] 吳銳.高并發(fā)Web系統(tǒng)的設(shè)計(jì)與應(yīng)用[J].電腦知識(shí)與技術(shù),2013(13).
[5] 姜景根,李祥.基于Java的多線(xiàn)程并發(fā)服務(wù)器的設(shè)計(jì)與應(yīng)用[J].電腦與信息技術(shù),2007,15(1):15.
[6] 梁明剛,陳西曲.Linux下基于epoll+線(xiàn)程池高并發(fā)服務(wù)器實(shí)現(xiàn)研究[J].武漢工業(yè)學(xué)院學(xué)報(bào),2012(3):54.
[7] 金婧,陳家銓?zhuān)蹙柑?,?基于Go 語(yǔ)言及Beego 等開(kāi)源技術(shù)的公務(wù)車(chē)輛管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].信息通信,2015(2):140-141.