- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想利用 Go 中的并发性 将数据发送到 goroutine 以使用 channel 进行处理和计算。数据点一个接一个地出现在一个函数中,这个函数可以是 main 函数,也可以是某个 sendData
函数。 如果可能,我希望从主函数发送数据。
我想将数据从发送函数发送到一个 goroutine,其中数据存储在一个 slice 中(我们称这个 goroutine getData
)。某些计算是在这个 slice 上完成的。 在达到某个条件(取决于 slice )后,我希望 goroutine 向 sendData
函数发送信号,表明对某批数据点的处理已完成。 并且现在,sendData
函数不断通过 channel 将数据点发送到 getData
goroutine,在 goroutine 中不断构建新的 slice ,当达到条件时发送信号 - 即处理完成并且整个序列不断重复。
举个例子,假设数字形式的数据正在从 sendData
发送到 getData
。条件是 getData
接收到的数字的运行平均值应等于 4。让我们将以下数字序列作为我们的数据 - []int{3, 2, 3, 8 , 2, 1, 1, 1, 15}
。在这里,第一批数字将是 {3, 2, 3, 8}
,因为在将这些数字按此顺序发送到 getData
后,它会发现运行平均值在 getData
接收到数字 8 后,数字的数量等于 4。然后它向 sendData
发送一个信号。发送数据的过程再次开始,下一批是 {2, 1, 1, 1, 15}
。此处,在 getData
收到数字 15
后,它发现运行平均值等于 4,再次向 sendData
发送信号。 ( 这是一个非常基本的示例 - 在我的实际用例中,输入数据和条件更为复杂。我有将在 sendData
中实时读取的数据。这里每个数据点是按顺序读取,但每个数据点在前一个数据点之后几微秒到达。因此,数据的到达速度很快,我不想在这个函数中做太多的处理和计算。此外,我想保持并发完好,因为在读取数据的函数中,数据到达的速度很快。而且,我不希望因为在完成处理的goroutine中处理数据而错过这里的数据读取。 )
以下是我尝试构建代码的方式:
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
go sendData(ch)
go getData(ch)
}
func sendData(ch chan int) {
syntheticData := []int{3, 2, 3, 8, 2, 1, 1, 1, 15}
for _, data := range syntheticData {
ch <- data
}
}
func getData(ch chan int) {
dataArr := []int{}
dataArr = append( dataArr, <-ch )
fmt.Println(dataArr)
if mean(dataArr) == 4{
close(ch)
}
}
func sum(array []int) int {
var result int = 0
for _, v := range array {
result += v
}
return result
}
func mean(array []int) float64 {
sumArr := float64(sum(array)) / float64(len(array))
return sumArr
}
我没有用上面的代码实现我想要的功能。 如何在 Go 中实现所需的功能?
最佳答案
你只需要一个extera接收goroutine,例如getData
然后 main
goroutine 将在数据到达时使用名为 ch
的 channel 发送数据,您需要一个缓冲 信号 channel ,例如batchCompleted
,还有一个 WaitGroup
等待 getData
同步,当它完成>.
就是这样,试试it :
package main
import (
"fmt"
"sync"
)
func main() {
wg := &sync.WaitGroup{}
ch := make(chan int)
batchCompleted := make(chan struct{}, 1) // non-blocking signaling channel
wg.Add(1)
go getData(ch, batchCompleted, wg)
syntheticData := []int{3, 2, 3, 8, 2, 1, 1, 1, 15}
i := 0
check := func() {
select {
case <-batchCompleted:
i++
fmt.Println(i, " batch completed")
default:
}
}
for _, data := range syntheticData {
ch <- data
check()
}
close(ch)
wg.Wait()
check()
}
func getData(ch chan int, batchCompleted chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
a := []int{}
sum, n := 0, 0
for v := range ch {
sum += v
n++
a = append(a, v)
if sum == 4*n {
batchCompleted <- struct{}{}
fmt.Println(a)
sum, n = 0, 0
a = a[:0]
}
}
if len(a) > 0 {
fmt.Println("remaining data:", a)
}
}
输出:
[3 2 3 8]
1 batch completed
[2 1 1 1 15]
2 batch completed
关于go - 如何使用 goroutines 接收数据并发回信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66624680/
发件人:http://blog.nindalf.com/how-goroutines-work/ As the goroutines are scheduled cooperatively, a go
很多时候在用 Go 开发 http 服务器时,我都会遇到这种困境。 假设我想尽快用http statuscode 200响应客户端(然后在后面执行工作),这就是我通常这样做的原因: 我让我的主要 ht
这是代码: import "fmt" func main() { messages := make(chan string, 1) go func(c chan string) {
我正在学习 Golang,但遇到了一些困难。我已经研究过 Google,但没有任何进展。 我编写了一个代码,通过多台服务器的 ICMP 检查 RTT。 它有这样的结构: type Server str
我想运行多个 goroutine,进行一些处理,将结果放入 channel ,当至少有一个 goroutine 完成时,完成所有其他 goroutine 并从 channel 返回结果。 所以,我尝试
我有两个(但以后我会是三个)go 例程来处理来自远程服务器(来自 ampq channel )的传入消息。但是因为它们正在处理相同的数据/状态,所以我想阻止所有其他 go 例程,除了正在运行的例程。
我有一个案例,我从 2 个不同的位置(ES 和 REDIS)读取数据,我需要从最快的源读取一个值,因此我触发了 2 个 goroutines,一个从 ES 获取数据,其他从REDIS获取。 一旦从其中
像这里一样,我创建了一个 go playground 示例:sGgxEh40ev ,但无法正常工作。 quit := make(chan bool) res := make(chan int) go
我是golang的新手,正在研究goroutine。 我写了一个简单的代码,故意使用 goroutine 来划分数字。 首先,我给出基数并继续除它的数,直到它不能被整除 但是,我改变了go split
Main { go routine_1(carryout a time consuming task and return output) go routine_2(wait for output f
我想知道从另一个 goroutine 返回时调用的 goroutine 会发生什么。他们是继续运行还是被终止?这是一个示例代码来说明我的意思: func func() { // Doing s
更具体地说,在我的例子中,我有一个网络服务器和一个全局可访问的结构,网络服务器使用它来生成页面。我有另一个 Goroutine,它总是定期用新值更新该结构。这会引起问题吗?我是否需要实现一种机制来确保
来自 this file ,我不明白为什么函数startWorker会这样写: func (p *WorkerPool) dispatch() { for i := 0; i < p.maxW
我正在学习围棋,但在使用 goroutines 时遇到了问题。这是我的代码 package main import ( "fmt" "sync" "time" ) var co
我收到以下错误,我不明白为什么: 发送:查询 Herefatal 错误:所有 goroutines 都睡着了 - 死锁! 您可以看到我正在调用我使用 goroutine 创建的函数 routine。我
大家好,我正在从 Python3 过渡到 Go,所以我正在尝试重写我创建的库以获得更好的性能。 我面临一个问题,因为我是 Golang XD 中的新手,我使用有限的 API 下载数百个 json,我想
我有以下格式的脚本部分: func main() { for i=0;i<1000000;i++ { go test() } } func test() { a := test
package main func main() { c:=make(chan int) for i:=0; i<=100;i++ {
我正在学习 Go,我的第一个项目是一个简单的 ping 脚本。本质上,我想 ping 一堆 url,并在每个响应时等待 XXX 秒,然后再次 ping。这是删减的代码: func mai
这个问题在这里已经有了答案: Go all goroutines are asleep deadlock (2 个回答) fatal error: all goroutines are asleep
我是一名优秀的程序员,十分优秀!