新聞中心
目前?gproc?組件提供的進(jìn)程通信特性屬于實(shí)驗(yàn)性特性!

創(chuàng)新互聯(lián)專注于企業(yè)營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、洛龍網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開(kāi)發(fā)、商城網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為洛龍等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
不要通過(guò)共享內(nèi)存來(lái)通信,而應(yīng)該通過(guò)通信來(lái)共享內(nèi)存。
常見(jiàn)的進(jìn)程通信方式有5種:管道/信號(hào)量/共享內(nèi)存/共享文件/?Socket?。按照常見(jiàn)的并發(fā)架構(gòu)的設(shè)計(jì)來(lái)講,我們盡可能地少用鎖機(jī)制,包括共享內(nèi)存/共享文件其實(shí)都是需要依靠鎖機(jī)制才能保證數(shù)據(jù)流的正確性,因?yàn)殒i機(jī)制帶來(lái)的維護(hù)復(fù)雜度往往會(huì)比其帶來(lái)的好處更多。信號(hào)量常用在?*nix?系統(tǒng)中,跨平臺(tái)性比較差。管道雖然實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,但是在穩(wěn)定性上并沒(méi)有?Socket?機(jī)制好。因此,?gproc?實(shí)現(xiàn)的進(jìn)程通信采用的是?Socket?機(jī)制。但是需要注意的是,通信的兩個(gè)進(jìn)程都需要使用?gproc?模塊來(lái)實(shí)現(xiàn)發(fā)送&接收數(shù)據(jù)。
?gproc?的進(jìn)程通信API非常簡(jiǎn)便,只需通過(guò)以下兩個(gè)方法實(shí)現(xiàn):
func Send(pid int, data []byte) error
func Receive() *Msg
我們通過(guò)?Send?方法向指定的進(jìn)程發(fā)送數(shù)據(jù)(每調(diào)用一次相當(dāng)于發(fā)送一條消息),在指定的進(jìn)程中可以通過(guò)?Receive?方法獲得數(shù)據(jù)。其中,?Receive?方法提供了類似消息隊(duì)列的形式來(lái)收取其他進(jìn)程傳遞的數(shù)據(jù),當(dāng)隊(duì)列為空時(shí),該方法將會(huì)阻塞等待。
我們來(lái)看一個(gè)進(jìn)程間通信的基本使用示例:
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))
}
}
}
該示例中,我們的主進(jìn)程啟動(dòng)時(shí)創(chuàng)建了一個(gè)子進(jìn)程,該子進(jìn)程每隔1秒鐘向主進(jìn)程發(fā)送當(dāng)前的時(shí)間,主進(jìn)程收取到子進(jìn)程發(fā)送的參數(shù)后輸出到終端上。執(zhí)行后,終端輸出的內(nèi)容如下:
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
...
當(dāng)前文章:創(chuàng)新互聯(lián)GoFrame教程:GoFramegproc-進(jìn)程通信
鏈接分享:http://www.dlmjj.cn/article/dpiggsj.html


咨詢
建站咨詢
