Go語言併發程式設計 模擬shell命令的管道符

2021-09-24 08:19:34 字數 1199 閱讀 6425

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進行...