新聞中心
目前?gproc?組件提供的進程通信特性屬于實驗性特性!

創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設、網(wǎng)站重做改版、洛龍網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5開發(fā)、商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為洛龍等各大城市提供網(wǎng)站開發(fā)制作服務。
不要通過共享內存來通信,而應該通過通信來共享內存。
常見的進程通信方式有5種:管道/信號量/共享內存/共享文件/?Socket?。按照常見的并發(fā)架構的設計來講,我們盡可能地少用鎖機制,包括共享內存/共享文件其實都是需要依靠鎖機制才能保證數(shù)據(jù)流的正確性,因為鎖機制帶來的維護復雜度往往會比其帶來的好處更多。信號量常用在?*nix?系統(tǒng)中,跨平臺性比較差。管道雖然實現(xiàn)起來比較簡單,但是在穩(wěn)定性上并沒有?Socket?機制好。因此,?gproc?實現(xiàn)的進程通信采用的是?Socket?機制。但是需要注意的是,通信的兩個進程都需要使用?gproc?模塊來實現(xiàn)發(fā)送&接收數(shù)據(jù)。
?gproc?的進程通信API非常簡便,只需通過以下兩個方法實現(xiàn):
func Send(pid int, data []byte) error
func Receive() *Msg
我們通過?Send?方法向指定的進程發(fā)送數(shù)據(jù)(每調用一次相當于發(fā)送一條消息),在指定的進程中可以通過?Receive?方法獲得數(shù)據(jù)。其中,?Receive?方法提供了類似消息隊列的形式來收取其他進程傳遞的數(shù)據(jù),當隊列為空時,該方法將會阻塞等待。
我們來看一個進程間通信的基本使用示例:
package main
import (
"fmt"
"github.com/GOgf/gf/v2/os/gproc"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/os/gtimer"
"os"
"time"
)
func main() {
fmt.Printf("%d: I am child? %v\n", gproc.Pid(), gproc.IsChild())
if gproc.IsChild() {
gtimer.SetInterval(time.Second, func() {
gproc.Send(gproc.PPid(), []byte(gtime.Datetime()))
})
select {}
} else {
m := gproc.NewManager()
p := m.NewProcess(os.Args[0], os.Args, os.Environ())
p.Start()
for {
msg := gproc.Receive()
fmt.Printf("receive from %d, data: %s\n", msg.SendPid, string(msg.Data))
}
}
}
該示例中,我們的主進程啟動時創(chuàng)建了一個子進程,該子進程每隔1秒鐘向主進程發(fā)送當前的時間,主進程收取到子進程發(fā)送的參數(shù)后輸出到終端上。執(zhí)行后,終端輸出的內容如下:
29978: I am child? false
29984: I am child? true
receive from 29984, data: 2018-05-18 15:01:00
receive from 29984, data: 2018-05-18 15:01:01
receive from 29984, data: 2018-05-18 15:01:02
receive from 29984, data: 2018-05-18 15:01:03
receive from 29984, data: 2018-05-18 15:01:04
...
當前標題:創(chuàng)新互聯(lián)GoFrame教程:GoFramegproc-進程通信
URL鏈接:http://www.5511xx.com/article/dpiggsj.html


咨詢
建站咨詢
