新聞中心
go語(yǔ)言聊天室實(shí)現(xiàn)(六)創(chuàng)建HTTP連接,并升級(jí)為長(zhǎng)連接
我們?cè)趍ian函數(shù)中,首先初始化配置文件,然后新建http連接。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供睢縣網(wǎng)站建設(shè)、睢縣做網(wǎng)站、睢縣網(wǎng)站設(shè)計(jì)、睢縣網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、睢縣企業(yè)網(wǎng)站模板建站服務(wù),十年睢縣做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
這個(gè)連接創(chuàng)建之后,監(jiān)聽(tīng)服務(wù)器的9999端口。如果url的路徑后綴為 "/ws",就轉(zhuǎn)發(fā)到ws/ws.go中的IndexHandler方法中。
這個(gè)方法中首先我們創(chuàng)建一個(gè)websocket的Upgrader實(shí)例,然后我們使用Upgrader的upgrade方法來(lái)升級(jí)一下我們的連接為長(zhǎng)連接。
升級(jí)完成之后會(huì)返回一個(gè)*websocket.Conn的連接,我們之后所有的關(guān)于連接的操作,都是基于該conn的。
在該連接完成之后,我們將連接存放到一個(gè)名為Client的map中,以便之后管理更為方便。
之后,我們啟動(dòng)一個(gè)goroutine來(lái)讀取連接中發(fā)送的信息內(nèi)容,再根據(jù)內(nèi)容進(jìn)行相應(yīng)的操作。
golang 進(jìn)程創(chuàng)建,fork,以及熱重啟(無(wú)縫升級(jí))
一般來(lái)說(shuō),進(jìn)程的操作使用的是一些系統(tǒng)的命令,所以go內(nèi)部使用os包,進(jìn)行一些運(yùn)行系統(tǒng)命令的操作
os 包及其子包 os/exec 提供了創(chuàng)建進(jìn)程的方法。
一般的,應(yīng)該優(yōu)先使用 os/exec 包。因?yàn)?os/exec 包依賴 os 包中關(guān)鍵創(chuàng)建進(jìn)程的 API,為了便于理解,我們先探討 os 包中和進(jìn)程相關(guān)的部分。
Unix :fork創(chuàng)建一個(gè)進(jìn)程,(及其一些變種,如 vfork、clone)。
Go:Linux 下創(chuàng)建進(jìn)程使用的系統(tǒng)調(diào)用是 clone。
允許一進(jìn)程(父進(jìn)程)創(chuàng)建一新進(jìn)程(子進(jìn)程)。具體做法是,新的子進(jìn)程幾近于對(duì)父進(jìn)程的翻版:子進(jìn)程獲得父進(jìn)程的棧、數(shù)據(jù)段、堆和執(zhí)行文本段的拷貝。可將此視為把父進(jìn)程一分為二。
終止一進(jìn)程,將進(jìn)程占用的所有資源(內(nèi)存、文件描述符等)歸還內(nèi)核,交其進(jìn)行再次分配。參數(shù) status 為一整型變量,表示進(jìn)程的退出狀態(tài)。父進(jìn)程可使用系統(tǒng)調(diào)用 wait() 來(lái)獲取該狀態(tài)。
目的有二:其一,如果子進(jìn)程尚未調(diào)用 exit() 終止,那么 wait 會(huì)掛起父進(jìn)程直至子進(jìn)程終止;其二,子進(jìn)程的終止?fàn)顟B(tài)通過(guò) wait 的 status 參數(shù)返回。
加載一個(gè)新程序(路徑名為 pathname,參數(shù)列表為 argv,環(huán)境變量列表為 envp)到當(dāng)前進(jìn)程的內(nèi)存。這將丟棄現(xiàn)存的程序文本段,并為新程序重新創(chuàng)建棧、數(shù)據(jù)段以及堆。通常將這一動(dòng)作稱為執(zhí)行一個(gè)新程序。
沒(méi)有直接提供 fork 系統(tǒng)調(diào)用的封裝,而是將 fork 和 execve 合二為一,提供了 syscall.ForkExec。如果想只調(diào)用 fork,得自己通過(guò) syscall.Syscall(syscall.SYS_FORK, 0, 0, 0) 實(shí)現(xiàn)。
os.Process 存儲(chǔ)了通過(guò) StartProcess 創(chuàng)建的進(jìn)程的相關(guān)信息。
一般通過(guò) StartProcess 創(chuàng)建 Process 的實(shí)例,函數(shù)聲明如下:
它使用提供的程序名、命令行參數(shù)、屬性開(kāi)始一個(gè)新進(jìn)程。StartProcess 是一個(gè)低級(jí)別的接口。os/exec 包提供了高級(jí)別的接口,一般應(yīng)該盡量使用 os/exec 包。如果出錯(cuò),錯(cuò)誤的類型會(huì)是 *PathError。
屬性定義如下:
FindProcess 可以通過(guò) pid 查找一個(gè)運(yùn)行中的進(jìn)程。該函數(shù)返回的 Process 對(duì)象可以用于獲取關(guān)于底層操作系統(tǒng)進(jìn)程的信息。在 Unix 系統(tǒng)中,此函數(shù)總是成功,即使 pid 對(duì)應(yīng)的進(jìn)程不存在。
Process 提供了四個(gè)方法:Kill、Signal、Wait 和 Release。其中 Kill 和 Signal 跟信號(hào)相關(guān),而 Kill 實(shí)際上就是調(diào)用 Signal,發(fā)送了 SIGKILL 信號(hào),強(qiáng)制進(jìn)程退出,關(guān)于信號(hào),后續(xù)章節(jié)會(huì)專門講解。
Release 方法用于釋放 Process 對(duì)象相關(guān)的資源,以便將來(lái)可以被再使用。該方法只有在確定沒(méi)有調(diào)用 Wait 時(shí)才需要調(diào)用。Unix 中,該方法的內(nèi)部實(shí)現(xiàn)只是將 Process 的 pid 置為 -1。
通過(guò) os 包可以做到運(yùn)行外部命令,如前面的例子。不過(guò),Go 標(biāo)準(zhǔn)庫(kù)為我們封裝了更好用的包: os/exec,運(yùn)行外部命令,應(yīng)該優(yōu)先使用它,它包裝了 os.StartProcess 函數(shù)以便更容易的重定向標(biāo)準(zhǔn)輸入和輸出,使用管道連接 I/O,以及作其它的一些調(diào)整。
exec.LookPath 函數(shù)在 PATH 指定目錄中搜索可執(zhí)行程序,如 file 中有 /,則只在當(dāng)前目錄搜索。該函數(shù)返回完整路徑或相對(duì)于當(dāng)前路徑的一個(gè)相對(duì)路徑。
func LookPath(file string) (string, error)
如果在 PATH 中沒(méi)有找到可執(zhí)行文件,則返回 exec.ErrNotFound。
Cmd 結(jié)構(gòu)代表一個(gè)正在準(zhǔn)備或者在執(zhí)行中的外部命令,調(diào)用了 Run、Output 或 CombinedOutput 后,Cmd 實(shí)例不能被重用。
一般的,應(yīng)該通過(guò) exec.Command 函數(shù)產(chǎn)生 Cmd 實(shí)例:
用法
得到 * Cmd 實(shí)例后,接下來(lái)一般有兩種寫法:
前面講到,通過(guò) Cmd 實(shí)例后,有兩種方式運(yùn)行命令。有時(shí)候,我們不只是簡(jiǎn)單的運(yùn)行命令,還希望能控制命令的輸入和輸出。通過(guò)上面的 API 介紹,控制輸入輸出有幾種方法:
參考資料:
Golang升級(jí)到1.5了.請(qǐng)問(wèn)下MAC OS 上如何更新Golang
買10.8.1升級(jí)10.8.2.市場(chǎng)沒(méi)升級(jí)提醒自網(wǎng)載升級(jí)包安裝請(qǐng)問(wèn)應(yīng)該辦
必須 Mac OS X 10.7.4 Lion 系統(tǒng)才更新 OS X 10.8 .
您 Mac OS X 10.6.x 系統(tǒng)請(qǐng)先升級(jí) Mac OS X 10.6.8 再載 10.7 系統(tǒng)安裝包升級(jí).
確保您系統(tǒng)已經(jīng)升級(jí) Mac OS X 10.7.4 更新 10.8系統(tǒng)通appstore購(gòu)買網(wǎng)載升級(jí)包升級(jí)
機(jī)型才能升級(jí):
iMac ( 2007期或更新)
MacBook (2008末或2009初或更新)
MacBook Pro (2007或末或更新)
Xserve (2009初)
MacBook Air (2008末或更新)
Mac mini (2009初或更新)
Mac Pro (2008初或更新)
golang自動(dòng)更新怎么實(shí)現(xiàn)
首先理解是錯(cuò)的,不管用戶態(tài)的API(syscall)是否是同步還是異步,在kernel層面都是異步的。
其實(shí)實(shí)現(xiàn)原理很簡(jiǎn)單,就是利用C(嵌入?yún)R編)語(yǔ)言可以直接修改寄存器(setcontext/setjmp/longjmp均是類似原理,修改程序指針eip實(shí)現(xiàn)跳轉(zhuǎn),棧指針實(shí)現(xiàn)上線文切換)來(lái)實(shí)現(xiàn)從func_a調(diào)進(jìn)去,從func_b返回出來(lái)這種行為。對(duì)于golang來(lái)說(shuō),func_a/func_b屬于不同的goroutine,從而就實(shí)現(xiàn)了goroutine的調(diào)度切換。
另外對(duì)于所有可能阻塞的syscall,golang對(duì)其進(jìn)行了封裝,底層實(shí)際是epoll方式做的,注冊(cè)回調(diào)后切換到另一個(gè)runnable的goroutine。
名稱欄目:go語(yǔ)言怎么升級(jí) 如何學(xué)好go語(yǔ)言
分享鏈接:http://www.ef60e0e.cn/article/docoejd.html