Go 語(yǔ)言及其在大并發(fā)環(huán)境下的應(yīng)用_第1頁(yè)
Go 語(yǔ)言及其在大并發(fā)環(huán)境下的應(yīng)用_第2頁(yè)
Go 語(yǔ)言及其在大并發(fā)環(huán)境下的應(yīng)用_第3頁(yè)
Go 語(yǔ)言及其在大并發(fā)環(huán)境下的應(yīng)用_第4頁(yè)
Go 語(yǔ)言及其在大并發(fā)環(huán)境下的應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Go語(yǔ)言及其在大并發(fā)環(huán)境下的應(yīng)用張景埕/diogin

(@diogin)diogin@2012.12.08關(guān)于我程序員@360Go語(yǔ)言忠實(shí)追隨者與實(shí)踐者2010.08開(kāi)始接觸Go語(yǔ)言并喜歡上了它hello,worldFAQ:什么是Go語(yǔ)言?Google主導(dǎo)開(kāi)發(fā)的一門通用編程語(yǔ)言,BSDLUnix之父KenThompson、Unix先驅(qū)RobPikeC+Python+Limbo(并發(fā))編譯+匯編+鏈接(主要是靜態(tài)鏈接)簡(jiǎn)潔、樸素、直觀的語(yǔ)法語(yǔ)法級(jí)的并發(fā)與自動(dòng)化垃圾回收支持卓越的國(guó)際化與跨平臺(tái)支持FAQ:為什么要發(fā)明Go語(yǔ)言?計(jì)算機(jī)越來(lái)越快,軟件開(kāi)發(fā)速度卻跟不上C/C++大型項(xiàng)目依賴管理復(fù)雜,編譯鏈接等操作太耗時(shí)如何充分利用多核、如何高效地進(jìn)行并發(fā)編程越來(lái)越讓程序員頭疼沒(méi)有一門現(xiàn)有語(yǔ)言同時(shí)具備快速編譯、高效執(zhí)行、快樂(lè)編程三個(gè)目標(biāo)傳統(tǒng)的面向?qū)ο笳Z(yǔ)言太注重類型繼承,過(guò)于臃腫、啰嗦內(nèi)存管理、DLL地獄困擾著系統(tǒng)程序員FAQ:Go語(yǔ)言能做什么?除了編寫操作系統(tǒng)內(nèi)核及其模塊之外,Go可以做各種應(yīng)用級(jí)別的開(kāi)發(fā)當(dāng)前最適合編寫各種服務(wù)器程序(Web服務(wù)器,應(yīng)用服務(wù)器,游戲服務(wù)器,數(shù)據(jù)存儲(chǔ)服務(wù)器等等)GUI桌面應(yīng)用程序開(kāi)發(fā)(還不成熟)手機(jī)App開(kāi)發(fā)(還不成熟)教育、科學(xué)計(jì)算……FAQ:Go語(yǔ)言的目標(biāo)是什么?同時(shí)具備靜態(tài)語(yǔ)言的運(yùn)行效率、動(dòng)態(tài)語(yǔ)言的開(kāi)發(fā)效率類型安全、內(nèi)存安全優(yōu)秀的并發(fā)與通信能力高效、無(wú)延遲的自動(dòng)化垃圾收集高速編譯與靜態(tài)鏈接豐富、高質(zhì)量的包FAQ:Go在編程語(yǔ)言譜系中的位置?FAQ:Go在編程語(yǔ)言譜系中的位置?FAQ:Go在編程語(yǔ)言譜系中的位置?一、Go程序運(yùn)行原理、相關(guān)工具、語(yǔ)言規(guī)范及標(biāo)準(zhǔn)庫(kù)(1)Go程序運(yùn)行原理靜態(tài)鏈接的二進(jìn)制可執(zhí)行程序(gc編譯器)只依賴內(nèi)核,完全不依賴libc/glibc/crt(意味著Go程序自己封裝了系統(tǒng)調(diào)用)由多個(gè)包(package)聯(lián)編而成,每個(gè)包在加載時(shí)進(jìn)行初始化(通過(guò)init()函數(shù)),程序運(yùn)行入口為main包里的main函數(shù)每個(gè)程序都帶runtime包,進(jìn)行運(yùn)行時(shí)管理(調(diào)度、內(nèi)存管理、反射、高級(jí)數(shù)據(jù)類型實(shí)現(xiàn)、profiling、panic/race管理及檢測(cè)等)(1)Go程序運(yùn)行原理:從零開(kāi)始以linux/amd64為例(大體步驟):匯編例程_rt0_amd64_linux()->匯編例程_rt0_amd64()->準(zhǔn)備g和m寄存器->命令行參數(shù)初始化->OS級(jí)別的初始化->調(diào)度器初始化(內(nèi)存管理系統(tǒng)初始化->m初始化->并行能力探測(cè))->runtime·main()->垃圾收集器啟動(dòng)->main·init()->main·main()(1)Go程序運(yùn)行原理:什么是g/m?g=goroutine,m=machine(內(nèi)核線程)externregisterG*g;externregisterM*m;一個(gè)m上可以跑多個(gè)g,如果一個(gè)g進(jìn)行阻塞式系統(tǒng)調(diào)用,其它g可以調(diào)度到別的m上繼續(xù)運(yùn)行調(diào)度器的任務(wù)就是為g選擇合適的m來(lái)運(yùn)行(1)Go程序運(yùn)行原理:包初始化main包依賴其它包,其它包又依賴其它包,所有的依賴形成一個(gè)有向無(wú)環(huán)圖。每個(gè)包都可以有多init()函數(shù),在main·init()階段按深度優(yōu)先的方式遍歷調(diào)用以初始化所有的包,直到最后初始化main包。進(jìn)入main·main()時(shí),所有的包都完成了初始化。(1)Go程序運(yùn)行原理:程序視圖一個(gè)進(jìn)程,內(nèi)部多個(gè)goroutine并發(fā)運(yùn)行,多個(gè)goroutine共享一個(gè)內(nèi)核線程(machine),goroutine間通過(guò)channel進(jìn)行同步或異步通信。所有g(shù)oroutine共享進(jìn)程虛擬內(nèi)存空間程序由多個(gè)包以無(wú)環(huán)依賴的形式聯(lián)接而成,進(jìn)程開(kāi)始運(yùn)行之前全部包已完成初始化每個(gè)包有四種元素:const、var、type、func自動(dòng)化的內(nèi)存管理讓進(jìn)程無(wú)需手動(dòng)管理內(nèi)存釋放,靜態(tài)鏈接讓進(jìn)程無(wú)需擔(dān)心動(dòng)態(tài)鏈接庫(kù)是否存在(2)相關(guān)工具go:編譯匯編鏈接一體化,模擬腳本解釋器等在go開(kāi)發(fā)過(guò)程中需要進(jìn)行的各種操作godoc:一個(gè)在本地運(yùn)行的

官方網(wǎng)站鏡像,方便隨時(shí)查閱gofmt:雞血工具,代碼格式化,放進(jìn)scm掛勾,可以讓整個(gè)團(tuán)隊(duì)代碼格式完全一致gotoolfix:在不同Go版本間自動(dòng)升級(jí)代碼文本編輯器/IDE:按自己的愛(ài)好自由選擇(2)相關(guān)工具:Go標(biāo)準(zhǔn)目錄結(jié)構(gòu)通常每個(gè)項(xiàng)目有多個(gè)程序一個(gè)工程師可能同時(shí)開(kāi)發(fā)多個(gè)項(xiàng)目Go使用一個(gè)GOPATH模擬一個(gè)項(xiàng)目每個(gè)GOPATH有標(biāo)準(zhǔn)的目錄結(jié)構(gòu):bin/pkg/src/(3)Go語(yǔ)言規(guī)范概述1語(yǔ)法溯源:大體上屬于C系,有指針(new),有引用(make),“傳值”,簡(jiǎn)潔,容易上手類型后置式聲明,例如:variint=123“面向?qū)ο蟆保河脩舳x的類型可以附加方法,功能復(fù)用采用的是組合而非繼承“鴨子類型”:只需提供接口聲明的方法,該類型就滿足接口,無(wú)需顯式實(shí)現(xiàn)該接口“多返回值”:函數(shù)可以返回多個(gè)值,錯(cuò)誤處理不使用異常機(jī)制,而是用多返回值(3)Go語(yǔ)言規(guī)范概述2內(nèi)存安全:數(shù)組邊界檢查、堆與棧不區(qū)分,不存在C里面返回??臻g的地址等陷阱++、--操作不再是表達(dá)式,而成了語(yǔ)句內(nèi)置高級(jí)數(shù)據(jù)結(jié)構(gòu):map、closure嚴(yán)格的類型大小要求,保證跨平臺(tái)性panic/recover/defer:對(duì)致命錯(cuò)誤及其恢復(fù)機(jī)制的支持,對(duì)延遲調(diào)用的支持goroutine/channel/select:對(duì)并發(fā)的支持大小寫區(qū)分包內(nèi)元素對(duì)外部的可見(jiàn)性(3)Go語(yǔ)言詞法元素源代碼采用UTF-8編碼(Unicode6.2標(biāo)準(zhǔn))注釋(//、/*…*/)、標(biāo)識(shí)符(a,int)、關(guān)鍵字(if,go)、操作符(+,<-)、整數(shù)(123,0xff,0337)、浮點(diǎn)數(shù)(3.14,1e9)、虛數(shù)(3.14i,1e9i)、字符(’a’,‘中’)、字符串(”go”,“\n”)(3)Go語(yǔ)言規(guī)范:關(guān)鍵字(3)Go語(yǔ)言例子:if語(yǔ)句(3)Go語(yǔ)言例子:for語(yǔ)句(3)Go語(yǔ)言例子:switch語(yǔ)句(3)Go語(yǔ)言例子:混合(4)標(biāo)準(zhǔn)庫(kù)(部分)runtime:Go程序運(yùn)行時(shí)環(huán)境syscall:系統(tǒng)調(diào)用的封裝net:網(wǎng)絡(luò)協(xié)議棧封裝net/http:HTTP協(xié)議封裝os:跨平臺(tái)操作系統(tǒng)API封裝encoding/gob:Go程序進(jìn)程間通信編碼reflect:反射sync:同步原語(yǔ)strings:字符串APIbytes:字節(jié)API……其它官方網(wǎng)站:/項(xiàng)目托管:/p/go/郵件列表:

/group/golang-nuts二、Go在大并發(fā)環(huán)境下的應(yīng)用

并發(fā)與并行并發(fā)是一種程序設(shè)計(jì)模式Go語(yǔ)言在語(yǔ)法層面支持并發(fā)設(shè)計(jì)并行是一種可選的程序運(yùn)行優(yōu)化方法并發(fā)!=并行并發(fā)模型:多進(jìn)程、多線程、事件?Nginx:多進(jìn)程,每個(gè)進(jìn)程單線程(異步非阻塞I/O)Apache(prefork):多進(jìn)程,每個(gè)進(jìn)程單線程(同步阻塞I/O)PHP-FPM:同Apache(prefork)MySQL:?jiǎn)芜M(jìn)程+多線程(同步阻塞I/O)Memcached:?jiǎn)芜M(jìn)程+多線程+異步非阻塞I/ORedis:?jiǎn)芜M(jìn)程+單線程+異步非阻塞I/OGo的并發(fā)模型?單進(jìn)程,每個(gè)進(jìn)程多個(gè)goroutine(同步阻塞I/O。可以有上百萬(wàn)個(gè)goroutine,只要你內(nèi)存足夠大)goroutine(運(yùn)行單元)channel(通信通道,分緩沖式、非緩沖式)select語(yǔ)句(查看并選擇可運(yùn)行的通道操作)mutex,rwmutex,condition等等低級(jí)原語(yǔ)“Don’tcommunicatebysharedmemory.Instead,sharememorybycommunicating.——RobPike”goroutinegoroutineGo的基本并發(fā)單元單個(gè)goroutine占用5KB左右的??臻g一個(gè)普通的函數(shù)(或方法),通過(guò)go關(guān)鍵字進(jìn)行調(diào)用,就成了個(gè)goroutine沒(méi)有父子之說(shuō),全部goroutine地位平等無(wú)法在應(yīng)用層獲取goroutineidchannelchannelFirstclassvalueUnbuffered(同步)、buffered(異步)有向:僅接收、僅發(fā)送;或雙向通道內(nèi)可以發(fā)送任何firstclassvalue,包括通道自身,甚至一個(gè)函數(shù)selectselect某goroutine需要同時(shí)偵測(cè)多個(gè)channel上的事件如果沒(méi)有一個(gè)channel上有事件發(fā)生,同時(shí)提供了default分支,則執(zhí)行default分支實(shí)戰(zhàn):實(shí)時(shí)推送服務(wù)長(zhǎng)連接(HTTP,TCP),實(shí)時(shí)傳輸全雙工,實(shí)現(xiàn)上行發(fā)送、下行接收(TCP)每個(gè)長(zhǎng)連接三個(gè)goroutine,一個(gè)負(fù)責(zé)讀(阻塞在read),一個(gè)負(fù)責(zé)寫(阻塞在write),一個(gè)負(fù)責(zé)管理與協(xié)調(diào)(select),三者通過(guò)channel進(jìn)行內(nèi)部通信系統(tǒng)組件Room:負(fù)責(zé)對(duì)接客戶端Register:負(fù)責(zé)記錄哪些用戶當(dāng)前連接在哪個(gè)roomSaver:存儲(chǔ)離線消息IdGenerator:消息id生成器系統(tǒng)組件——room需要一個(gè)map用來(lái)記錄用戶與服務(wù)它的Server實(shí)例的對(duì)應(yīng)關(guān)系抽象Server接口,并用HttpServer、TcpServer實(shí)現(xiàn)接入?yún)f(xié)議,每個(gè)Server有一個(gè)channel用于緩沖消息抽象Service層可復(fù)用API用戶連接時(shí)注冊(cè)在線信息到register,離線時(shí)清除定期心跳方式檢測(cè)在線系統(tǒng)組件——registerHash(user)方式存儲(chǔ)用戶在線信息存儲(chǔ)方式為一個(gè)HashTable(采用Gomap)提供RPC接口(傳輸協(xié)議為gob)性質(zhì)類似redis,但方便添加邏輯系統(tǒng)組件——saver存儲(chǔ)抽象層,封裝后端存儲(chǔ)全對(duì)稱方式設(shè)計(jì)RPC(gob)系統(tǒng)組件——idGen

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論