003-golang 調(diào)用外部命令
創(chuàng)新互聯(lián)建站長(zhǎng)期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為曹縣企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),曹縣網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
相關(guān)函數(shù)
exec包執(zhí)行外部命令,它將os.StartProcess進(jìn)行包裝使得它更容易映射到stdin和stdout,并且利用pipe連接i/o.
func LookPath(file string) (string, error) //LookPath在環(huán)境變量中查找科執(zhí)行二進(jìn)制文件,如果file中包含一個(gè)斜杠,則直接根據(jù)絕對(duì)路徑或者相對(duì)本目錄的相對(duì)路徑去查找
在用exec包調(diào)用的其他進(jìn)程后如何關(guān)閉結(jié)束,可以使用context包的機(jī)制進(jìn)行管理,context包的使用詳見:
exec.CommandContext方發(fā)實(shí)現(xiàn)了context,通過context可以對(duì)exec啟動(dòng)的進(jìn)程結(jié)束。
隱藏程序自身黑窗口的方法:go build -ldflags="-H windows"
隱藏子進(jìn)程黑窗口的方法:
這樣生成,第一步,用網(wǎng)格建構(gòu)幾何體造型
1.1 用網(wǎng)格立方體指令MeshBox以以下參數(shù)在場(chǎng)景中生成一個(gè)立方體網(wǎng)格
◆定位方式:中心點(diǎn)
◆X、Y、Z網(wǎng)格數(shù)量:1
◆長(zhǎng)、寬、高:120mm
4ffb78ff09ca566aa38de58d7b6d2887.png
1.2 選取這個(gè)立方體網(wǎng)格,在指令提示欄內(nèi)鍵入subdivide指令,對(duì)立方體網(wǎng)格進(jìn)行一次細(xì)分操作,回車確認(rèn)后得到以下結(jié)果
0d04b57f2fee50e79c394afac4ae4825.png
▲每一個(gè)網(wǎng)格都被細(xì)分成4個(gè)
1.3 開啟網(wǎng)格的控制點(diǎn)(F10鍵),用SetPt指令與操作軸來調(diào)整網(wǎng)格的外形,讓它接近圖片內(nèi)底座的外形
f52515a9f6325f37500fd1c217e7e7aa.gif
1.4 使用Gumball操作軸,按住Ctrl+Shift鍵選取頂部的網(wǎng)格后擠出新網(wǎng)格面,以3軸收縮這些網(wǎng)格面,最后生成底座的凹陷特征
4d5fa7ef768f5106df6afb2ba616cdcc.gif
000a6340ad9d289bd9f32c28a368508c.png
▲得到這個(gè)結(jié)果
1.5 打開過濾器Filter,只勾選子物體及點(diǎn)和頂點(diǎn),這樣方便我們選取,然后調(diào)整頂部的造型
a952c6d5dc6de27fb0e9f3d932c5535f.png
cbaf2ad5ab060eed12f8098e6d46f66b.gif
▲每次操作完成后記得勾選停用過濾器
f7916f50e11c9480cf44a684a6d3ce7e.png
▲得到這個(gè)結(jié)果
1.6 繼續(xù)用操作軸、SetPT擠出并調(diào)整出底座連接處的形狀
1fe6501df44b8a8be92d6d2046aad2f0.gif
a4705350b3c2bd12b72749f9d6f80e11.gif
▲可切換至半透明顯示模式,方便選取
第二步,生成環(huán)繞圓管造型
2.1 在前視圖,Curve指令以放置控制點(diǎn)的方式建立環(huán)繞狀的曲線,以用作后續(xù)生成圓管之用。
f03cc4b53cbfc6590ede9ad67334b767.gif
2.2 先確認(rèn)已開啟了記錄建構(gòu)歷史,再用這曲線以Pipe指令生成圓管
d617ea1300c24145011e8d0fe7b29e5e.png
09a998212005b381ee5a68338aa7be7f.gif
▲選項(xiàng)中點(diǎn)擊為不加蓋
2.3 打開過濾器,只勾選曲線和控制點(diǎn)兩項(xiàng),打開這曲線的控制點(diǎn)來調(diào)整它的空間形態(tài),最后使圓管符合參考圖的形態(tài)
88556dfaede9a727a272934900f7a9ba.gif
▲帶有建構(gòu)歷史來生成圓管空間形態(tài)
第三步,轉(zhuǎn)換成網(wǎng)格進(jìn)行編輯
3.1 選取圓管曲面,用Rebuild指令進(jìn)行曲面重建,參數(shù)設(shè)定見下圖:
24cd0f199d873aae820778487df12d91.gif
3.2 選取重建后的圓管,用Mesh指令以下圖所示網(wǎng)格選項(xiàng)把曲面轉(zhuǎn)換成網(wǎng)格,最后刪除曲面只保留網(wǎng)格對(duì)象
92d2208636e4c465546d8b238e15f1fe.gif
3.3 按著Ctrl+Shift鍵,按下圖所示選取并刪除網(wǎng)格
ab673bb74102b000c1276866c9bad5cd.gif
第四步,生成細(xì)分曲面
4.1 使用3DFace指令,把底座與管子間以4邊結(jié)構(gòu)的方式進(jìn)行逐一連接,最后再把管子的開口封閉上。
4.2 連接完成后框選整個(gè)模型,用Join指令把所有網(wǎng)格組合成一體
4.3 在指令提示欄中鍵入subdfrommesh指令,選取模型后回車確定,生成細(xì)分曲面
5c8045a7b27e55b18d7b46f00b3d3d54.gif
▲4.1-4.3步驟如動(dòng)圖所示
第五步,細(xì)分曲面轉(zhuǎn)換成NURBS實(shí)體
5.1 當(dāng)牙刷架的形態(tài)確定后,用ToNurbs指令把這個(gè)細(xì)分曲面轉(zhuǎn)成NURBS曲面,最后組合成一個(gè)實(shí)體
5b20176e57bdf80ec9b32f59c5813319.gif
第六步,快速渲染
通過快速設(shè)定場(chǎng)景、材質(zhì)、燈光后,切換到光線跟蹤顯示模式(Cycles引擎),即可快速得到一張效果不錯(cuò)的渲染圖
52e36f7035dc277d18ece7a125732e93.png
點(diǎn)擊
Rhino 6 渲染公開課_騰訊課堂ke.qq.com
3a7c009a8b39b99ca515fa7d4c568671.png
免費(fèi)學(xué)習(xí)Rhino 6 產(chǎn)品渲染教學(xué)
歡迎關(guān)注Rhino原廠微信公眾平臺(tái),每周都有新技能分享哦~
fc244b6903c2906cd9e0e4abf8fd76f4.png
相關(guān)資源:RHINO犀牛軟件入門教程-軟考工具類資源-CSDN文庫
打開CSDN APP,看更多技術(shù)內(nèi)容
圖片跟著鼠標(biāo)_Rhino細(xì)分建模分享 Part2鼠標(biāo)底部造型與細(xì)節(jié)_鄧凌佳的博...
目前RhinoWIP 還沒有直接提供細(xì)分頂點(diǎn)、邊線與片面的過濾工具,所以選擇的時(shí)候需要比較細(xì)心一些,推薦使用Ctrl+Shift+鼠標(biāo)左鍵選取子物件的方式,選取細(xì)分特征時(shí)雙擊鼠標(biāo)左鍵還可以實(shí)現(xiàn)快速 Loop選擇,例如上圖中最后的RemoveCrease 2.2細(xì)分建模...
繼續(xù)訪問
檢測(cè)鼠標(biāo)是否雙擊_Rhino細(xì)分建模分享 Part3 鼠標(biāo)簡(jiǎn)易結(jié)構(gòu)設(shè)計(jì)_weixin_39...
這里提供兩個(gè)方法進(jìn)行干涉檢查,RhinoWIP的新增功能 Clash ,這工具可以分兩組選擇,然后在兩組之間快速的找到干涉的位置。 2.2 第二個(gè)方法是使用兩組物件之間計(jì)算相交線的工具 IntersectTwoSets,見以下GIF: 提示: 如果使用 IntersectTwoSets...
繼續(xù)訪問
pipe flow expert 教程
pipe flow expert 教程 2013版本
PipeTransformer:適用于大規(guī)模模型分布式訓(xùn)練的自動(dòng)化彈性管線
內(nèi)容導(dǎo)讀 本文圍繞一篇論文展開,探討了 PyTorch DDP (torch.nn.parallel) 以及 Pipeline (torch.Distributed.Pipeline) 的加速混合。 本文首發(fā)自微信公眾號(hào)「PyTorch 開發(fā)者社區(qū)」 論文題目: PipeTransformer: Automated Elastic Pipelining for Distributed Training of Large-scale Models(PipeTransformer: 用于大規(guī)模模型分布式訓(xùn).
繼續(xù)訪問
史上最全三維建模軟件匯總_普通網(wǎng)友的博客_最容易入門的...
3、Rhino Rhinocero,簡(jiǎn)稱Rhino,又叫犀牛,是一款三維建模工具。不過不要小瞧它,它的基本操作和AutoCAD有相似之處,擁有AutoCAD基礎(chǔ)的初學(xué)者更易于掌握犀牛。目前廣泛應(yīng)用于工業(yè)設(shè)計(jì)、建筑、家具、鞋模設(shè)計(jì),擅長(zhǎng)產(chǎn)品外觀造型建模。 4、Zbrush ...
繼續(xù)訪問
OCTO 2.0:美團(tuán)基于Service Mesh的服務(wù)治理系統(tǒng)詳解_美團(tuán)技術(shù)團(tuán)隊(duì)的博客...
基礎(chǔ)設(shè)施是指美團(tuán)現(xiàn)有的服務(wù)治理系統(tǒng)OCTO1.0,包括MNS、KMS(鑒權(quán)管理服務(wù))、MCC(配置管理中心)、Rhino(熔斷限流服務(wù))等。這些系統(tǒng)接入到OCTO 2.0的控制平面,避免過多重構(gòu)引入的不必要成本。
繼續(xù)訪問
進(jìn)程(四):進(jìn)程間通信 —— Queue(隊(duì)列)和Pipe(管道)
目錄 進(jìn)程間通信 隊(duì)列 概念介紹 方法介紹 代碼實(shí)例 生產(chǎn)者消費(fèi)者模型 JoinableQueue([maxsize]) 管道(了解) 進(jìn)程間通信 IPC(Inter-Process Communication) 隊(duì)列 概念介紹 創(chuàng)建共享的進(jìn)程隊(duì)列,Queue是多進(jìn)程安全的隊(duì)列,可以使用Queue實(shí)現(xiàn)多進(jìn)程之間的數(shù)據(jù)傳遞。 ●Queue([maxsize]) 創(chuàng)建...
繼續(xù)訪問
PIPE 使用介紹
文章目錄一、pipe 簡(jiǎn)介二、pipe 代碼示例 一、pipe 簡(jiǎn)介 pipe 也叫無名管道,有如下特點(diǎn): 半雙工,同一時(shí)刻數(shù)據(jù)只能一端操作 數(shù)據(jù)只能從一端寫入,從另一端讀出 存儲(chǔ)在內(nèi)存緩沖區(qū),不存儲(chǔ)在文件系統(tǒng)中,只能用于父子進(jìn)程通信 數(shù)據(jù)一旦從管道中讀走,就從管道中釋放空間 二、pipe 代碼示例 創(chuàng)建無名管道,其中 fd[0] 固定用于讀管道,而 fd[1] 固定用于寫管道 一般文件 I/O 的函數(shù)都可以用來操作管道( lseek() 除外) 默認(rèn)情況當(dāng)管道里沒有數(shù)據(jù)時(shí),另一個(gè)進(jìn)程調(diào)用 read(
繼續(xù)訪問
3dmax軟件給模型添加標(biāo)注尺寸教程_3d模型的博客_3dmax做的模型...
步驟一、使用3dmax軟件的“工具”—“測(cè)量距離”,可以測(cè)量任意位置的距離。包括模型之間的尺寸。 步驟二、我們可以看到使用3dmax軟件測(cè)量距離工具后的模型尺寸結(jié)果。接下來我們需要將尺寸數(shù)據(jù)添加標(biāo)注到模型上。
繼續(xù)訪問
Rhino5曲面造型插件Autodesk T-Splines v4.0.r11183_rrjjzzyy00的博客...
Rhino5曲面造型插件Autodesk T-Splines v4.0.r11183 Autodesk T-Splines結(jié)合了Nurbs和細(xì)分表面建模技術(shù)的特點(diǎn),雖然和Nurbs很相似,不過它極大地減少了模型表 面上的控制點(diǎn)數(shù)目,可以進(jìn)行局部細(xì)分和合并兩個(gè)Nurbs面片等操作,使你的建模操作...
繼續(xù)訪問
Go語言并發(fā)模型:像Unix Pipe那樣使用channel
簡(jiǎn)介 Go語言的并發(fā)原語允許開發(fā)者以類似于 Unix Pipe 的方式構(gòu)建數(shù)據(jù)流水線 (data pipelines),數(shù)據(jù)流水線能夠高效地利用 I/O和多核 CPU 的優(yōu)勢(shì)。 本文要講的就是一些使用流水線的一些例子,流水線的錯(cuò)誤處理也是本文的重點(diǎn)。 閱讀建議 數(shù)據(jù)流水線充分利用了多核特性,代碼層面是基于 channel 類型 和 go ...
繼續(xù)訪問
pipe建模工具使用_PDMS進(jìn)行管道建模的一些方法及操作技巧,快來Get!
2.通過網(wǎng)絡(luò)實(shí)現(xiàn)多專業(yè)實(shí)時(shí)協(xié)同設(shè)計(jì)、真實(shí)的現(xiàn)場(chǎng)環(huán)境,多個(gè)專業(yè)組可以協(xié)同設(shè)計(jì)以建立一個(gè)詳細(xì)的3D數(shù)字工廠模型,每個(gè)設(shè)計(jì)者在設(shè)計(jì)過程中都可以隨時(shí)查看其它設(shè)計(jì)者正在干什么;3.交互設(shè)計(jì)過程中,實(shí)時(shí)三維碰撞檢查,PDMS能自動(dòng)地在元件和各專業(yè)設(shè)計(jì)之間進(jìn)行碰撞檢查,在整體上保證設(shè)計(jì)結(jié)果的準(zhǔn)確性;4.擁有獨(dú)立的數(shù)據(jù)庫結(jié)構(gòu),元件和設(shè)備信息全部可以存儲(chǔ)在參數(shù)化的元件庫和設(shè)備庫中,不依賴第三方數(shù)據(jù)庫;5.開放的開發(fā)...
繼續(xù)訪問
8款超級(jí)好用的3D建模軟件上下篇_李旭me的博客_3d建模軟件
Rhino,又稱犀牛,是由美國(guó)Robert McNeel公司于1998年推出的一款基于NURBS為主三維建模軟件。功能齊全、價(jià)格實(shí)惠、對(duì)用戶友好,很多中小工作室都在使用Rhino來設(shè)計(jì)產(chǎn)品。 作為近年來在工業(yè)、建筑等領(lǐng)域最流行的軟件,Rhino的建模思路十分自由,但...
繼續(xù)訪問
淺談管道模型(Pipeline)
本篇和大家談?wù)勔环N通用的設(shè)計(jì)與處理模型——Pipeline(管道)。 Pipeline簡(jiǎn)介 Pipeline模型最早被使用在Unix操作系統(tǒng)中。據(jù)稱,如果說Unix是計(jì)算機(jī)文明中最偉大的發(fā)明,那么,Unix下的Pipe管道就是跟隨Unix所帶來的另一個(gè)偉大的發(fā)明【1】。我認(rèn)為管道的出現(xiàn),所要解決的問題,還是軟件設(shè)計(jì)中老生常談的設(shè)計(jì)目標(biāo)——高內(nèi)聚,低耦合。它以一種“鏈?zhǔn)侥P汀眮泶硬煌某绦蚧蛘卟煌?..
繼續(xù)訪問
pipe建模工具使用_GraphPipe
軟件簡(jiǎn)介GraphPipe 是甲骨文開源的通用深度學(xué)習(xí)模型部署框架。官方對(duì) GraphPipe的定義為,這是一種協(xié)議和軟件集合,旨在簡(jiǎn)化機(jī)器學(xué)習(xí)模型部署并將其與特定于框架的模型實(shí)現(xiàn)分離。甲骨文表示,這一新工具可提供跨深度學(xué)習(xí)框架的模型通用 API、開箱即用的部署方案以及強(qiáng)大的性能。GraphPipe 為在網(wǎng)絡(luò)上傳遞張量數(shù)據(jù)(tensordata)提供了一個(gè)標(biāo)準(zhǔn)、高性能的協(xié)議,以及提供了客戶端和服務(wù)...
繼續(xù)訪問
Select模型(PIPE)
Lin中的函數(shù)select和poll用來,支持Unix中I/O復(fù)用的功能,在Unix中I/O模型可以分為以一幾種: (1)阻塞I/O (2)非阻塞I/O (3)I/O復(fù)用(select和poll) (4)信號(hào)驅(qū)動(dòng)I/O(SIGIO) (5)異步I/O 其中,現(xiàn)在比較流行的I/O模型是阻塞I/O模型.阻塞I/O是當(dāng)應(yīng)用程序和內(nèi)核交換數(shù)據(jù)時(shí),由于內(nèi)核還沒有準(zhǔn)備
繼續(xù)訪問
深入理解PIPE
轉(zhuǎn)載: 在linux中要進(jìn)行進(jìn)程間通信有多種方法:pipe、fifo、共享內(nèi)存,信號(hào)量,消息隊(duì)列,共享文件等等。其中pipe和fifo 使用最廣泛,二者的區(qū)別為pipe為匿名管道,只能用在有父子關(guān)系的進(jìn)程間通信,而fifo可以通過文件系統(tǒng)中的一個(gè)文件取得,所以不受上述限制。作為父子進(jìn)程間通信的通道,pipe同樣可以看作是一個(gè)先進(jìn)先出的
繼續(xù)訪問
最新發(fā)布 HQoS配置學(xué)習(xí)
傳統(tǒng)的QoS基于端口進(jìn)行流量調(diào)度,無法區(qū)分用戶和用戶不同的業(yè)務(wù)。HQoS可以針對(duì)每個(gè)用戶的業(yè)務(wù)流進(jìn)行隊(duì)列調(diào)度。
繼續(xù)訪問
犀牛重建曲面_犀牛建模常用命令及思路分析
犀牛建模常用命令及思路分析對(duì)于新手剛接觸犀牛建模的軟件都是比較懵懂,有許多的細(xì)節(jié)都不太了解,所以需要許多資料和教程來教新手學(xué)會(huì)這些技能,從建模到渲染這些步驟,好的技術(shù)都是不斷操練才有所效果的,一起來看看給新人的犀牛建模常用技巧!首先我們大家要對(duì)視圖進(jìn)行認(rèn)識(shí)了解視圖一般默認(rèn)為四個(gè)視圖(正視圖、頂視圖、透視圖、右視圖)也可以根據(jù)自己的需求更改添加視圖點(diǎn)擊視圖名稱右鍵里面可以根據(jù)自己的需要更改視圖的模式...
繼續(xù)訪問
Linux網(wǎng)絡(luò)編程 - 在服務(wù)器端運(yùn)用進(jìn)程間通信之管道(pipe)
本文主要講解進(jìn)程間通信之一的管道(匿名管道)方式,討論Linux系統(tǒng)中管道的工作原理及其使用方法,并將管道機(jī)制運(yùn)用在Linux網(wǎng)絡(luò)編程之中。
繼續(xù)訪問
熱門推薦 Linux進(jìn)程間通信分類 以及 pipe的原理實(shí)現(xiàn)
一個(gè)大型的應(yīng)用系統(tǒng),往往需要眾多進(jìn)程協(xié)作,進(jìn)程(Linux進(jìn)程概念見附1)間通信的重要性顯而易見。本系列文章闡述了Linux環(huán)境下的幾種
繼續(xù)訪問
Rhino顯示左邊的工具欄
步驟 頂部菜單“工具” “選項(xiàng)” 左邊的“Rhino選項(xiàng)” 展開“工具列” “大小和型式” 勾選“顯示邊欄” 確定
繼續(xù)訪問
pipe建模工具使用_pipe4.3 petri網(wǎng)軟件
【實(shí)例簡(jiǎn)介】petri網(wǎng)建模工具pipe4.3,需要先配置java環(huán)境【實(shí)例截圖】【核心代碼】PIPEv4.3.0├── __MACOSX│ └── PIPEv4.3.0└── PIPEv4.3.0├── launch.bat├── launch.sh├── Pipe│ ├── cfg│ │ ├── classification.properties│ │ ├── comp...
繼續(xù)訪問
7分鐘學(xué)會(huì)匿名管道pipe()的使用(內(nèi)附完整代碼測(cè)試)
7分鐘學(xué)會(huì)匿名管道pipe()的使用(內(nèi)附完整代碼測(cè)試)
繼續(xù)訪問
細(xì)分曲面—增加細(xì)分曲面對(duì)象
NURBS是大部分三維軟件支持的一種優(yōu)秀的建模方式,它能很好的控制物體表面的曲線度,從而創(chuàng)建出更逼真、更生動(dòng)的造型。NURBS是非均勻有理樣條曲線的縮寫。 Cinema 4D提供的NURBS建模方式分為細(xì)分曲面、擠壓、旋轉(zhuǎn)、放樣、掃描和貝塞爾6種。 細(xì)分曲面 : 擠壓 旋轉(zhuǎn) 放樣 掃描 貝塞爾 ...
繼續(xù)訪問
Rhino 6 偏移曲面 選項(xiàng)有很多玄機(jī)
Rhino 6 偏移曲面 選項(xiàng) 要打開圓角選項(xiàng) 偏移的曲面就是一個(gè)整體。 倒角可以選擇兩面的一面曲線來倒角。
繼續(xù)訪問
linux下面的pipe命令
pipe命令在linux shell中是很重要的概念管道pipe,意思是上一次命令的輸出是下一個(gè)命令的輸入,但是,我們知道,一個(gè)命令的輸出,是沒有固定格式的如ls -l一樣,輸出的是大段大大段的數(shù)據(jù),那么我們?cè)趺窗堰@些數(shù)據(jù)格式化成為我們下一個(gè)命令能用的呢?這就要用linux下面的一些管道命令了;1)cut: cut -d “分隔符” -f "區(qū)快" -c "字符界限" 如: cut /et
繼續(xù)訪問
rhino細(xì)分工具講解
pipe建模工具使用
寫評(píng)論
1、學(xué)習(xí)曲線
它包含了類C語法、GC內(nèi)置和工程工具。這一點(diǎn)非常重要,因?yàn)镚o語言容易學(xué)習(xí),所以一個(gè)普通的大學(xué)生花一個(gè)星期就能寫出來可以上手的、高性能的應(yīng)用。在國(guó)內(nèi)大家都追求快,這也是為什么國(guó)內(nèi)Go流行的原因之一。
2、效率
Go擁有接近C的運(yùn)行效率和接近PHP的開發(fā)效率,這就很有利的支撐了上面大家追求快速的需求。
3、出身名門、血統(tǒng)純正
之所以說Go語言出身名門,是因?yàn)槲覀冎繥o語言出自Google公司,這個(gè)公司在業(yè)界的知名度和實(shí)力自然不用多說。Google公司聚集了一批牛人,在各種編程語言稱雄爭(zhēng)霸的局面下推出新的編程語言,自然有它的戰(zhàn)略考慮。而且從Go語言的發(fā)展態(tài)勢(shì)來看,Google對(duì)它這個(gè)新的寵兒還是很看重的,Go自然有一個(gè)良好的發(fā)展前途。我們看看Go語言的主要?jiǎng)?chuàng)造者,血統(tǒng)純正這點(diǎn)就可見端倪了。
4、組合的思想、無侵入式的接口
Go語言可以說是開發(fā)效率和運(yùn)行效率二者的完美融合,天生的并發(fā)編程支持。Go語言支持當(dāng)前所有的編程范式,包括過程式編程、面向?qū)ο缶幊桃约昂瘮?shù)式編程。
5、強(qiáng)大的標(biāo)準(zhǔn)庫
這包括互聯(lián)網(wǎng)應(yīng)用、系統(tǒng)編程和網(wǎng)絡(luò)編程。Go里面的標(biāo)準(zhǔn)庫基本上已經(jīng)是非常穩(wěn)定,特別是我這里提到的三個(gè),網(wǎng)絡(luò)層、系統(tǒng)層的庫非常實(shí)用。
6、部署方便
我相信這一點(diǎn)是很多人選擇Go的最大理由,因?yàn)椴渴鹛奖悖袁F(xiàn)在也有很多人用Go開發(fā)運(yùn)維程序。
7、簡(jiǎn)單的并發(fā)
它包含降低心智的并發(fā)和簡(jiǎn)易的數(shù)據(jù)同步,我覺得這是Go最大的特色。之所以寫正確的并發(fā)、容錯(cuò)和可擴(kuò)展的程序如此之難,是因?yàn)槲覀冇昧隋e(cuò)誤的工具和錯(cuò)誤的抽象,Go可以說這一塊做的相當(dāng)簡(jiǎn)單。
8、穩(wěn)定性
Go擁有強(qiáng)大的編譯檢查、嚴(yán)格的編碼規(guī)范和完整的軟件生命周期工具,具有很強(qiáng)的穩(wěn)定性,穩(wěn)定壓倒一切。那么為什么Go相比于其他程序會(huì)更穩(wěn)定呢?這是因?yàn)镚o提供了軟件生命周期的各個(gè)環(huán)節(jié)的工具,如go
tool、gofmt、go test。
前言
最近工作中遇到的一個(gè)場(chǎng)景,php項(xiàng)目中需要使用一個(gè)第三方的功能,而恰好有一個(gè)用Golang寫好的類庫。那么問題就來了,要如何實(shí)現(xiàn)不同語言之間的通信呢?下面就來一起看看吧。
常規(guī)的方案
1、 用Golang寫一個(gè)http/TCP服務(wù),php通過http/TCP與Golang通信
2、將Golang經(jīng)過較多封裝,做為php擴(kuò)展。
3、PHP通過系統(tǒng)命令,調(diào)取Golang的可執(zhí)行文件
存在的問題
1、http請(qǐng)求,網(wǎng)絡(luò)I/O將會(huì)消耗大量時(shí)間
2、需要封裝大量代碼
3、PHP每調(diào)取一次Golang程序,就需要一次初始化,時(shí)間消耗很多
優(yōu)化目標(biāo)
1、Golang程序只初始化一次(因?yàn)槌跏蓟芎臅r(shí))
2、所有請(qǐng)求不需要走網(wǎng)絡(luò)
3、盡量不大量修改代碼
解決方案
1、簡(jiǎn)單的Golang封裝,將第三方類庫編譯生成為一個(gè)可執(zhí)行文件
2、PHP與Golang通過雙向管道通信
使用雙向管道通信優(yōu)勢(shì)
1:只需要對(duì)原有Golang類庫進(jìn)行很少的封裝
2:性能最佳 (IPC通信是進(jìn)程間通信的最佳途徑)
3:不需要走網(wǎng)絡(luò)請(qǐng)求,節(jié)約大量時(shí)間
4:程序只需初始化一次,并一直保持在內(nèi)存中
具體實(shí)現(xiàn)步驟
1:類庫中的原始調(diào)取demo
package main
import (
"fmt"
"github.com/yanyiwu/gojieba"
"strings"
)
func main() {
x := gojieba.NewJieba()
defer x.Free()
s := "小明碩士畢業(yè)于中國(guó)科學(xué)院計(jì)算所,后在日本京都大學(xué)深造"
words := x.CutForSearch(s, true)
fmt.Println(strings.Join(words, "/"))
}
保存文件為main.go,就可以運(yùn)行
2:調(diào)整后代碼為:
package main
import (
"bufio"
"fmt"
"github.com/yanyiwu/gojieba"
"io"
"os"
"strings"
)
func main() {
x := gojieba.NewJieba(
"/data/tmp/jiebaDict/jieba.dict.utf8",
"/data/tmp/jiebaDict/hmm_model.utf8",
"/data/tmp/jiebaDict/user.dict.utf8"
)
defer x.Free()
inputReader := bufio.NewReader(os.Stdin)
for {
s, err := inputReader.ReadString('\n')
if err != nil err == io.EOF {
break
}
s = strings.TrimSpace(s)
if s != "" {
words := x.CutForSearch(s, true)
fmt.Println(strings.Join(words, " "))
} else {
fmt.Println("get empty \n")
}
}
}
只需要簡(jiǎn)單的幾行調(diào)整,即可實(shí)現(xiàn):從標(biāo)準(zhǔn)輸入接收字符串,經(jīng)過分詞再輸出
測(cè)試:
# go build test
# ./test
# //等待用戶輸入,輸入”這是一個(gè)測(cè)試“
# 這是 一個(gè) 測(cè)試 //程序
3:使用cat與Golang通信做簡(jiǎn)單測(cè)試
//準(zhǔn)備一個(gè)title.txt,每行是一句文本
# cat title.txt | ./test
正常輸出,表示cat已經(jīng)可以和Golang正常交互了
4:PHP與Golang通信
以上所示的cat與Golang通信,使用的是單向管道。即:只能從cat向Golang傳入數(shù)據(jù),Golang輸出的數(shù)據(jù)并沒有傳回給cat,而是直接輸出到屏幕。但文中的需求是:php與Golang通信。即php要傳數(shù)據(jù)給Golang,同時(shí)Golang也必須把執(zhí)行結(jié)果返回給php。因此,需要引入雙向管道。
在PHP中管道的使用:popen("/path/test") ,具體就不展開說了,因?yàn)榇朔椒ń鉀Q不了文中的問題。
雙向管道:
$descriptorspec = array(
0 = array("pipe", "r"),
1 = array("pipe", "w")
);
$handle = proc_open(
'/webroot/go/src/test/test',
$descriptorspec,
$pipes
);
fwrite($pipes['0'], "這是一個(gè)測(cè)試文本\n");
echo fgets($pipes[1]);
解釋:使用proc_open打開一個(gè)進(jìn)程,調(diào)用Golang程序。同時(shí)返回一個(gè)雙向管道pipes數(shù)組,php向$pipe['0']中寫數(shù)據(jù),從$pipe['1']中讀數(shù)據(jù)。
好吧,也許你已經(jīng)發(fā)現(xiàn),我是標(biāo)題檔,這里重點(diǎn)要講的并不只是PHP與Golang如何通信。而是在介紹一種方法: 通過雙向管道讓任意語言通信。(所有語言都會(huì)實(shí)現(xiàn)管道相關(guān)內(nèi)容)
測(cè)試:
通過對(duì)比測(cè)試,計(jì)算出各個(gè)流程占用的時(shí)間。下面提到的title.txt文件,包含100萬行文本,每行文本是從b2b平臺(tái)取的商品標(biāo)題
1: 整體流程耗時(shí)
time cat title.txt | ./test /dev/null
耗時(shí):14.819秒,消耗時(shí)間包含:
進(jìn)程cat讀出文本
通過管道將數(shù)據(jù)傳入Golang
Golang處理數(shù)據(jù),將結(jié)果返回到屏幕
2:計(jì)算分詞函數(shù)耗時(shí)。方案:去除分詞函數(shù)的調(diào)取,即:注釋掉Golang源代碼中的調(diào)取分詞那行的代碼
time cat title.txt | ./test /dev/null
耗時(shí):1.817秒時(shí)間,消耗時(shí)間包含:
進(jìn)程cat讀出文本
通過管道將數(shù)據(jù)傳入Golang
Golang處理數(shù)據(jù),將結(jié)果返回到屏幕
分詞耗時(shí) = (第一步耗時(shí)) - (以上命令所耗時(shí))
分詞耗時(shí) : 14.819 - 1.817 = 13.002秒
3:測(cè)試cat進(jìn)程與Golang進(jìn)程之間通信所占時(shí)間
time cat title.txt /dev/null
耗時(shí):0.015秒,消耗時(shí)間包含:
進(jìn)程cat讀出文本
通過管道將數(shù)據(jù)傳入Golang
go處理數(shù)據(jù),將結(jié)果返回到屏幕
管道通信耗時(shí):(第二步耗時(shí)) - (第三步耗時(shí))
管道通信耗時(shí): 1.817 - 0.015 = 1.802秒
4:PHP與Golang通信的時(shí)間消耗
編寫簡(jiǎn)單的php文件:
?php
$descriptorspec = array(
0 = array("pipe", "r"),
1 = array("pipe", "w")
);
$handle = proc_open(
'/webroot/go/src/test/test',
$descriptorspec,
$pipes
);
$fp = fopen("title.txt", "rb");
while (!feof($fp)) {
fwrite($pipes['0'], trim(fgets($fp))."\n");
echo fgets($pipes[1]);
}
fclose($pipes['0']);
fclose($pipes['1']);
proc_close($handle);
流程與上面基本一致,讀出title.txt內(nèi)容,通過雙向管道傳入Golang進(jìn)程分詞后,再返回給php (比上面的測(cè)試多一步:數(shù)據(jù)再通過管道返回)
time php popen.php /dev/null
耗時(shí):24.037秒,消耗時(shí)間包含:
進(jìn)程PHP讀出文本
通過管道將數(shù)據(jù)傳入Golang
Golang處理數(shù)據(jù)
Golang將返回結(jié)果再寫入管道,PHP通過管道接收數(shù)據(jù)
將結(jié)果返回到屏幕
結(jié)論:
1 :整個(gè)分詞過程中的耗時(shí)分布
使用cat控制邏輯耗時(shí): 14.819 秒
使用PHP控制邏輯耗時(shí): 24.037 秒(比cat多一次管道通信)
單向管道通信耗時(shí): 1.8 秒
Golang中的分詞函數(shù)耗時(shí): 13.002 秒
2:分詞函數(shù)的性能: 單進(jìn)程,100萬商品標(biāo)題分詞,耗時(shí)13秒
以上時(shí)間只包括分詞時(shí)間,不包括詞典載入時(shí)間。但在本方案中,詞典只載入一次,所以載入詞典時(shí)間可以忽略(1秒左右)
3:PHP比cat慢 (這結(jié)論有點(diǎn)多余了,呵呵)
語言層面慢: (24.037 - 1.8 - 14.819) / 14.819 = 50%
單進(jìn)程對(duì)比測(cè)試的話,應(yīng)該不會(huì)有哪個(gè)語言比cat更快。
相關(guān)問題:
1:以上Golang源碼中寫的是一個(gè)循環(huán),也就是會(huì)一直從管道中讀數(shù)據(jù)。那么存在一個(gè)問題:是不是php進(jìn)程結(jié)束后,Golang的進(jìn)程還會(huì)一直存在?
管道機(jī)制自身可解決此問題。管道提供兩個(gè)接口:讀、寫。當(dāng)寫進(jìn)程結(jié)束或者意外掛掉時(shí),讀進(jìn)程也會(huì)報(bào)錯(cuò),以上Golang源代碼中的err邏輯就會(huì)執(zhí)行,Golang進(jìn)程結(jié)束。
但如果PHP進(jìn)程沒有結(jié)束,只是暫時(shí)沒有數(shù)據(jù)傳入,此時(shí)Golang進(jìn)程會(huì)一直等待。直到php結(jié)束后,Golang進(jìn)程才會(huì)自動(dòng)結(jié)束。
2:能否多個(gè)php進(jìn)程并行讀寫同一個(gè)管道,Golang進(jìn)程同時(shí)為其服務(wù)?
不可以。管道是單向的,如果多個(gè)進(jìn)程同時(shí)向管道中寫,那Golang的返回值就會(huì)錯(cuò)亂。
可以多開幾個(gè)Golang進(jìn)程實(shí)現(xiàn),每個(gè)php進(jìn)程對(duì)應(yīng)一個(gè)Golang進(jìn)程。
最后,上面都是瞎扯的。如果你了解管道、雙向管道,上面的解釋對(duì)你基本沒啥用。但如果你不了解管道,調(diào)試上面的代碼沒問題,但稍有修改就有可能掉坑里。