gpt4 book ai didi

sql - Go 相当于 GCD 串行调度队列

转载 作者:数据小太阳 更新时间:2023-10-29 03:16:10 24 4
gpt4 key购买 nike

是否有与 Apple 的 GCD 串行调度队列等效的 Go?

到目前为止,我只找到了一种解决方案,即函数 channel 。

work := make(chan func()) 

我会有一个函数从这个 channel 接收并调用接收到的函数。这些函数必须按 FIFO 顺序执行。

在 Go 中是否有更好的方法或结构来执行此操作?

这应该不会有什么不同,但我希望将 SQL 查询排队以为此在 FIFO 中运行。

最佳答案

@OneOfOne,很接近但不完全是。

我最终在 Go 中实现了串行调度队列可用 here .

它基本上是一个 go 例程,阻塞在 func() 类型的 channel 上,并运行按顺序传递的函数。

实现:

//Package serialqueue provides a serial queue for functions. 
//Queue items are processed in First In First Out (FIFO) order.
package serialqueue

//New returns a new serial queue.
//Enqueue items like queueObj <- func() {doWork(data)}
func New() chan func() {
//create channel of type function
var queue = make(chan func())

//spawn go routine to read and run functions in the channel
go func() {
for true {
nextFunction := <-queue
nextFunction()
}
}()

return queue
}

用法:(演示以正确顺序写入字符串)

//Package serialqueue provides provides tests for github.com/ansonl/serialqueue. 
package serialqueue_test

import (
"testing"
"fmt"
"sync"
"github.com/ansonl/serialqueue"
)

func TestQueue(t *testing.T) {
//Create new serial queue
queue := serialqueue.New()

//Number of times to loop
var loops = 100

//Queue output will be added here
var queueOutput string

//WaitGroup for determining when queue output is finished
var wg sync.WaitGroup

//Create function to place in queue
var printTest = func(i int) {
queueOutput = fmt.Sprintf("%v%v",queueOutput, i)
wg.Done()
}

//Add functions to queue
var i int;
for i=0;i<loops;i++ {
wg.Add(1)
t:=i
queue <- func() {printTest(t)}
}

//Generate correct output
var correctOutput string
for i=0;i<loops;i++ {
correctOutput = fmt.Sprintf("%v%v", correctOutput, i)
}

//Wait until all functions in queue are done
wg.Wait()

//Compare queue output with correct output
if queueOutput != correctOutput {
t.Errorf("Serial Queue produced %v, want %v", queueOutput, correctOutput);
}
}

希望这对遇到同样问题的人有所帮助!

关于sql - Go 相当于 GCD 串行调度队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34926930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com