如果我启动一个进程并希望定期从中获取值,最简单的方法是什么?
下面的代码使用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 馈送到通道中的内容,以让子进程运行。 我只想在将来的某个时候检查一次或两次测量结果。
使用互斥体读取变量的当前值。互斥方法比通过通道通信更简单。
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())