simulate shell command "ps aux | grep qq"
程序間通訊(即ipc問題)是併發中最關鍵,重要的問題。
基本有三個大的解決方式
1:基於通訊
2:基於訊號(唯一的非同步i/o)
3: 基於同步
現在介紹一種最簡單的方式 :管道
eg:shell 中 「 |」 就是乙個管道符
管道符是一種半雙工的通訊方式 , 即乙個程序的輸出作為另乙個程序的輸入
管道符的實現如下
package main
// simulate shell command "ps aux | grep qq"
import
("bytes"
"fmt"
"log"
"os/exec"
)func
main()
if err := cmd1.
wait()
; err !=
nilvar outbuf2 bytes.buffer
cmd2.stdin =
&outbuf1
cmd2.stdout =
&outbuf2
if err := cmd2.
start()
; err !=
nilif err := cmd2.
wait()
; err !=
nil fmt.
println
(outbuf2.
string()
)}os/exec 是go的標準i/o包
**中第39行和第41行
cmd2.stdin = &outbuf1
cmd2.stdout = &outbuf2
表明了cmd1的輸出作為cmd2的輸入實現管道符的功能
最後一行
fmt.println(outbuf2.string())
轉換為string型別顯示在終端shell中
結果如下:完全模擬了ps aux | grep qq 的shell 命令
go語言併發程式設計
協程 coroutine 本質上是一種使用者態執行緒,不需要作業系統來進行搶占式排程,且在真正的實現中寄存於執行緒中,系統開銷極小。package main import fmt func count ch chan int,i int func main for ch range chs chan...
Go語言併發程式設計(二)
使用非常簡單,在函式前增加乙個go 例 go f a,b 開啟後,不等待其結束,主線程繼續執行。ps 要注意的是乙個goroutine開啟後,若不等其執行,main 主goroutine 中將繼續執行下一步,那麼主線程一結束,goroutine中的程式就不會執行了。如何解決?如下 func says...
Go語言 併發程式設計goroutine
在go語言中併發是通過goroutine實現。goroutine類似於執行緒,屬於使用者態執行緒。go語言也可以通過channel 管道 與多個goroutine進行通訊。goroutine類似於執行緒,在go語言中底層分配了乙個執行緒池,因此不需要我們對其進行管理,由go執行時的routine進行...