我是Go& amp;的新手我正在编写一个简单的Web应用程序。基本思路是:
goroutine#1是HTTP服务器
goroutine#2是一个管理应用程序状态的函数。它需要定期轮询某些硬件的值,因此它需要在自己的线程中运行。
当用户发出HTTP请求时,服务器将从状态goroutine请求更新信息,然后将HTML页面返回给客户端。
除了一件事之外,一切都很顺利:目前有六种不同的可能信号由服务器发送并从状态线程返回,包括请求和响应通道,总共12个通道(和I&# 39;我将添加至少一个或两个以上的信号)。有可能合并一些信号,但其中许多是不同的类型。
正如我所说,它有效,但它变得相当丑陋。
它看起来像这样:
main.go 包含实例化频道的声明:
// a shutdown signal
shutdown := make(chan bool)
// request the current state of a sensor
sensorRequest := make(chan string)
sensorResponse := make(chan Sensor)
// request the current state of ALL sensors
sensorListRequest := make(chan bool)
sensorListResponse := make(chan []Sensor)
// request the current state of the application (active or inactive)
statusRequest := make(chan bool)
statusResponse := make(chan bool)
// and a few more...
// start the "state manager" goroutine
go ManageState(shutdown, sensorRequest, sensorResponse, sensorListRequest, sensorListResponse, statusRequest, statusResponse)
// start the "HTTP server" goroutine
go ManageHTTP(shutdown, sensorRequest, sensorResponse, sensorListRequest, sensorListResponse, statusRequest, statusResponse)
所以,有几个问题:
是否需要单独的请求&回应渠道?鉴于请求和响应是不同的类型,我无法看到在两个方向上使用相同渠道的明显方式(不是很难)。
我考虑将所有频道都放入一个可以传递给所有goroutines的结构中,但我不确定它是否会带来任何真正的好处 - 它不会看起来比我现在做的更清楚。
Go go ™是做什么的?
更新
感谢@kostya和@Aedolon建议使用sync.Mutex
进行锁定/解锁的全局状态。这实际上是我的第一种方法,但我遇到了一个严重的问题:当锁被释放时,我的互斥Lock()
调用随机无法解锁。这段代码将在Raspberry Pi上运行,我怀疑某处有一个错误(在我用来读取硬件状态或Go ARM二进制文件的包中)。但是在花了很多时间试图追踪问题之后,我决定尝试不同的东西。
无论如何,在阅读(多次)之后,我应该通过共享记忆来进行沟通;相反,通过沟通来分享记忆。 (The Go Blog),我决定尝试以这种方式实施它。现在,我这样做,我发现我喜欢这种方法: - )
答案 0 :(得分:1)
我根本不会使用频道。
您可以从多个go-routine中的同一变量更新和读取共享状态,并使用sync.RWMutex进行同步。