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