版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Go語言及其在大并發(fā)環(huán)境下的應(yīng)用張景埕/diogin
(@diogin)diogin@2012.12.08關(guān)于我程序員@360Go語言忠實追隨者與實踐者2010.08開始接觸Go語言并喜歡上了它hello,worldFAQ:什么是Go語言?Google主導開發(fā)的一門通用編程語言,BSDLUnix之父KenThompson、Unix先驅(qū)RobPikeC+Python+Limbo(并發(fā))編譯+匯編+鏈接(主要是靜態(tài)鏈接)簡潔、樸素、直觀的語法語法級的并發(fā)與自動化垃圾回收支持卓越的國際化與跨平臺支持FAQ:為什么要發(fā)明Go語言?計算機越來越快,軟件開發(fā)速度卻跟不上C/C++大型項目依賴管理復(fù)雜,編譯鏈接等操作太耗時如何充分利用多核、如何高效地進行并發(fā)編程越來越讓程序員頭疼沒有一門現(xiàn)有語言同時具備快速編譯、高效執(zhí)行、快樂編程三個目標傳統(tǒng)的面向?qū)ο笳Z言太注重類型繼承,過于臃腫、啰嗦內(nèi)存管理、DLL地獄困擾著系統(tǒng)程序員FAQ:Go語言能做什么?除了編寫操作系統(tǒng)內(nèi)核及其模塊之外,Go可以做各種應(yīng)用級別的開發(fā)當前最適合編寫各種服務(wù)器程序(Web服務(wù)器,應(yīng)用服務(wù)器,游戲服務(wù)器,數(shù)據(jù)存儲服務(wù)器等等)GUI桌面應(yīng)用程序開發(fā)(還不成熟)手機App開發(fā)(還不成熟)教育、科學計算……FAQ:Go語言的目標是什么?同時具備靜態(tài)語言的運行效率、動態(tài)語言的開發(fā)效率類型安全、內(nèi)存安全優(yōu)秀的并發(fā)與通信能力高效、無延遲的自動化垃圾收集高速編譯與靜態(tài)鏈接豐富、高質(zhì)量的包FAQ:Go在編程語言譜系中的位置?FAQ:Go在編程語言譜系中的位置?FAQ:Go在編程語言譜系中的位置?一、Go程序運行原理、相關(guān)工具、語言規(guī)范及標準庫(1)Go程序運行原理靜態(tài)鏈接的二進制可執(zhí)行程序(gc編譯器)只依賴內(nèi)核,完全不依賴libc/glibc/crt(意味著Go程序自己封裝了系統(tǒng)調(diào)用)由多個包(package)聯(lián)編而成,每個包在加載時進行初始化(通過init()函數(shù)),程序運行入口為main包里的main函數(shù)每個程序都帶runtime包,進行運行時管理(調(diào)度、內(nèi)存管理、反射、高級數(shù)據(jù)類型實現(xiàn)、profiling、panic/race管理及檢測等)(1)Go程序運行原理:從零開始以linux/amd64為例(大體步驟):匯編例程_rt0_amd64_linux()->匯編例程_rt0_amd64()->準備g和m寄存器->命令行參數(shù)初始化->OS級別的初始化->調(diào)度器初始化(內(nèi)存管理系統(tǒng)初始化->m初始化->并行能力探測)->runtime·main()->垃圾收集器啟動->main·init()->main·main()(1)Go程序運行原理:什么是g/m?g=goroutine,m=machine(內(nèi)核線程)externregisterG*g;externregisterM*m;一個m上可以跑多個g,如果一個g進行阻塞式系統(tǒng)調(diào)用,其它g可以調(diào)度到別的m上繼續(xù)運行調(diào)度器的任務(wù)就是為g選擇合適的m來運行(1)Go程序運行原理:包初始化main包依賴其它包,其它包又依賴其它包,所有的依賴形成一個有向無環(huán)圖。每個包都可以有多init()函數(shù),在main·init()階段按深度優(yōu)先的方式遍歷調(diào)用以初始化所有的包,直到最后初始化main包。進入main·main()時,所有的包都完成了初始化。(1)Go程序運行原理:程序視圖一個進程,內(nèi)部多個goroutine并發(fā)運行,多個goroutine共享一個內(nèi)核線程(machine),goroutine間通過channel進行同步或異步通信。所有g(shù)oroutine共享進程虛擬內(nèi)存空間程序由多個包以無環(huán)依賴的形式聯(lián)接而成,進程開始運行之前全部包已完成初始化每個包有四種元素:const、var、type、func自動化的內(nèi)存管理讓進程無需手動管理內(nèi)存釋放,靜態(tài)鏈接讓進程無需擔心動態(tài)鏈接庫是否存在(2)相關(guān)工具go:編譯匯編鏈接一體化,模擬腳本解釋器等在go開發(fā)過程中需要進行的各種操作godoc:一個在本地運行的
官方網(wǎng)站鏡像,方便隨時查閱gofmt:雞血工具,代碼格式化,放進scm掛勾,可以讓整個團隊代碼格式完全一致gotoolfix:在不同Go版本間自動升級代碼文本編輯器/IDE:按自己的愛好自由選擇(2)相關(guān)工具:Go標準目錄結(jié)構(gòu)通常每個項目有多個程序一個工程師可能同時開發(fā)多個項目Go使用一個GOPATH模擬一個項目每個GOPATH有標準的目錄結(jié)構(gòu):bin/pkg/src/(3)Go語言規(guī)范概述1語法溯源:大體上屬于C系,有指針(new),有引用(make),“傳值”,簡潔,容易上手類型后置式聲明,例如:variint=123“面向?qū)ο蟆保河脩舳x的類型可以附加方法,功能復(fù)用采用的是組合而非繼承“鴨子類型”:只需提供接口聲明的方法,該類型就滿足接口,無需顯式實現(xiàn)該接口“多返回值”:函數(shù)可以返回多個值,錯誤處理不使用異常機制,而是用多返回值(3)Go語言規(guī)范概述2內(nèi)存安全:數(shù)組邊界檢查、堆與棧不區(qū)分,不存在C里面返回棧空間的地址等陷阱++、--操作不再是表達式,而成了語句內(nèi)置高級數(shù)據(jù)結(jié)構(gòu):map、closure嚴格的類型大小要求,保證跨平臺性panic/recover/defer:對致命錯誤及其恢復(fù)機制的支持,對延遲調(diào)用的支持goroutine/channel/select:對并發(fā)的支持大小寫區(qū)分包內(nèi)元素對外部的可見性(3)Go語言詞法元素源代碼采用UTF-8編碼(Unicode6.2標準)注釋(//、/*…*/)、標識符(a,int)、關(guān)鍵字(if,go)、操作符(+,<-)、整數(shù)(123,0xff,0337)、浮點數(shù)(3.14,1e9)、虛數(shù)(3.14i,1e9i)、字符(’a’,‘中’)、字符串(”go”,“\n”)(3)Go語言規(guī)范:關(guān)鍵字(3)Go語言例子:if語句(3)Go語言例子:for語句(3)Go語言例子:switch語句(3)Go語言例子:混合(4)標準庫(部分)runtime:Go程序運行時環(huán)境syscall:系統(tǒng)調(diào)用的封裝net:網(wǎng)絡(luò)協(xié)議棧封裝net/http:HTTP協(xié)議封裝os:跨平臺操作系統(tǒng)API封裝encoding/gob:Go程序進程間通信編碼reflect:反射sync:同步原語strings:字符串APIbytes:字節(jié)API……其它官方網(wǎng)站:/項目托管:/p/go/郵件列表:
/group/golang-nuts二、Go在大并發(fā)環(huán)境下的應(yīng)用
并發(fā)與并行并發(fā)是一種程序設(shè)計模式Go語言在語法層面支持并發(fā)設(shè)計并行是一種可選的程序運行優(yōu)化方法并發(fā)!=并行并發(fā)模型:多進程、多線程、事件?Nginx:多進程,每個進程單線程(異步非阻塞I/O)Apache(prefork):多進程,每個進程單線程(同步阻塞I/O)PHP-FPM:同Apache(prefork)MySQL:單進程+多線程(同步阻塞I/O)Memcached:單進程+多線程+異步非阻塞I/ORedis:單進程+單線程+異步非阻塞I/OGo的并發(fā)模型?單進程,每個進程多個goroutine(同步阻塞I/O。可以有上百萬個goroutine,只要你內(nèi)存足夠大)goroutine(運行單元)channel(通信通道,分緩沖式、非緩沖式)select語句(查看并選擇可運行的通道操作)mutex,rwmutex,condition等等低級原語“Don’tcommunicatebysharedmemory.Instead,sharememorybycommunicating.——RobPike”goroutinegoroutineGo的基本并發(fā)單元單個goroutine占用5KB左右的??臻g一個普通的函數(shù)(或方法),通過go關(guān)鍵字進行調(diào)用,就成了個goroutine沒有父子之說,全部goroutine地位平等無法在應(yīng)用層獲取goroutineidchannelchannelFirstclassvalueUnbuffered(同步)、buffered(異步)有向:僅接收、僅發(fā)送;或雙向通道內(nèi)可以發(fā)送任何firstclassvalue,包括通道自身,甚至一個函數(shù)selectselect某goroutine需要同時偵測多個channel上的事件如果沒有一個channel上有事件發(fā)生,同時提供了default分支,則執(zhí)行default分支實戰(zhàn):實時推送服務(wù)長連接(HTTP,TCP),實時傳輸全雙工,實現(xiàn)上行發(fā)送、下行接收(TCP)每個長連接三個goroutine,一個負責讀(阻塞在read),一個負責寫(阻塞在write),一個負責管理與協(xié)調(diào)(select),三者通過channel進行內(nèi)部通信系統(tǒng)組件Room:負責對接客戶端Register:負責記錄哪些用戶當前連接在哪個roomSaver:存儲離線消息IdGenerator:消息id生成器系統(tǒng)組件——room需要一個map用來記錄用戶與服務(wù)它的Server實例的對應(yīng)關(guān)系抽象Server接口,并用HttpServer、TcpServer實現(xiàn)接入?yún)f(xié)議,每個Server有一個channel用于緩沖消息抽象Service層可復(fù)用API用戶連接時注冊在線信息到register,離線時清除定期心跳方式檢測在線系統(tǒng)組件——registerHash(user)方式存儲用戶在線信息存儲方式為一個HashTable(采用Gomap)提供RPC接口(傳輸協(xié)議為gob)性質(zhì)類似redis,但方便添加邏輯系統(tǒng)組件——saver存儲抽象層,封裝后端存儲全對稱方式設(shè)計RPC(gob)系統(tǒng)組件——idGen
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025農(nóng)村征地合同協(xié)議書
- 2025農(nóng)村土地永久轉(zhuǎn)讓及生態(tài)保護合同全新制定
- 2025年度公司特色花卉組合采購服務(wù)協(xié)議3篇
- 二零二五年度地鐵車站清潔與安全服務(wù)合同3篇
- 二零二五年度物流運輸勞動合同勞務(wù)合同3篇
- 二零二五年度私人住宅泳池建造合同3篇
- 2025年度全款購車汽車用品贈送合同范本3篇
- 二零二五年度高校畢業(yè)生就業(yè)見習計劃合作協(xié)議3篇
- 2025年度環(huán)保設(shè)備銷售加盟合同協(xié)議
- 二零二五年度電力設(shè)施檢修與維修合同3篇
- 地下室頂板預(yù)留洞口施工方案標準版
- 2023-2024學年成都市武侯區(qū)六上數(shù)學期末達標測試試題含答案
- 軍事思想論文范文(通用6篇)
- (完整版)EORTC生命質(zhì)量測定量表QLQ-C30(V3.0)
- 七年級體育與健康 《足球》單元作業(yè)設(shè)計
- 毛細管升高法測量液體表面張力系數(shù)
- 室內(nèi)覆蓋方案設(shè)計與典型場景
- 放射性粒子植入自我評估報告
- 2023年山西云時代技術(shù)有限公司招聘筆試題庫及答案解析
- 浙大中控DCS系統(tǒng)介紹(簡潔版)
- GB/T 16288-2008塑料制品的標志
評論
0/150
提交評論