与 golang 进程通信:共享内存与通道

问题描述 投票:0回答:1

如果我启动一个进程并希望定期从中获取值,最简单的方法是什么?

下面的代码使用shared_variable来确定独立运行的Temperature_measurement_process的当前读数。 Golang 指南建议最好进行通信而不是使用共享内存。

import (
    "log"
    "time"
)

//IS THERE A BETTER WAY TO COMMUNICATE WITH temperature_measurement_process THAN shared_variable ?

func main() {

    shared_variable := 42

    go temperature_measurement_process(&shared_variable) //RUN INDEPENDENTLY, UPDATES EVERY 3 SECONDS

    log.Println("EARLY TEMP READING:", shared_variable)

    time.Sleep(3 * time.Second) //LET SOME ARBITRARY TIME PASS

    log.Println("LATER TEMP READING:", shared_variable)

}

// SIMULATED TEMPERATURE SENSOR
func temperature_measurement_process(temperature *int) {
    for {
        *temperature += 1
        time.Sleep(100 * time.Millisecond)
    }
}

创建通道并使用同步通信似乎会占用 CPU 资源。 使用通道似乎要求 main 不断读取 temp_measurement_process 馈送到通道中的内容,以让子进程运行。 我只想在将来的某个时候检查一次或两次测量结果。

在这里的操场上:https://go.dev/play/p/DQgaNzB0Z7k

go subprocess communication
1个回答
0
投票

使用互斥体读取变量的当前值。互斥方法比通过通道通信更简单。

type sensor struct {
    mu    sync.Mutex
    value int
}

func (s *sensor) run() {
    for {
        s.mu.Lock()
        s.value += 1
        s.mu.Unlock()
        time.Sleep(100 * time.Millisecond)
    }
}

func (s *sensor) get() int {
    s.mu.Lock()
    defer s.mu.Unlock()
    return s.value
}

这样称呼:

temperature := &sensor{value: 42}
go temperature.run()
log.Println("EARLY TEMP READING:", temperature.get())
time.Sleep(3 * time.Second) //LET SOME ARBITRARY TIME PASS
log.Println("LATER TEMP READING:", temperature.get())

https://go.dev/play/p/SBKHAS6dqn9

© www.soinside.com 2019 - 2024. All rights reserved.