vRp.CD2g_test/server/writeloop
kercylan98 f52d73e20e test: writeloop 包增加测试用例 2023-12-23 18:11:19 +08:00
..
README.md docs: 增加 writeloop 文档 2023-12-23 18:10:57 +08:00
writeloop.go other: 移除 writeloop 的 defer recover 行为,发生未处理错误将不再 panic,更改为输出 Error 日志 2023-12-23 18:10:40 +08:00
writeloop_benchmark_test.go test: writeloop 包增加测试用例 2023-12-23 18:11:19 +08:00
writeloop_example_test.go test: writeloop 包增加测试用例 2023-12-23 18:11:19 +08:00
writeloop_test.go test: writeloop 包增加测试用例 2023-12-23 18:11:19 +08:00

README.md

WriteLoop

Go doc

该包提供了一个并发安全的写循环实现。开发者可以使用它来快速构建和管理写入操作。

WriteLoop 写循环

写循环是一种特殊的循环,它可以并发安全地将数据写入到底层连接。写循环在 Minotaur 中是一个泛型类型,可以处理任意类型的消息。

WriteLoop 使用了 PoolUnbounded 进行实现。 通过 Pool 创建的消息对象无需手动释放,它会在写循环处理完消息后自动回收。

使用示例

package main

import (
    "fmt"
	"github.com/kercylan98/minotaur/server/writeloop"
	"github.com/kercylan98/minotaur/utils/concurrent"
)

func main() {
	pool := concurrent.NewPool[Message](func() *Message {
		return &Message{}
	}, func(data *Message) {
		data.ID = 0
	})
	var wait sync.WaitGroup
	wait.Add(10)
	wl := writeloop.NewWriteLoop(pool, func(message *Message) error {
		fmt.Println(message.ID)
		wait.Done()
		return nil
	}, func(err any) {
		fmt.Println(err)
	})

	for i := 0; i < 10; i++ {
		m := pool.Get()
		m.ID = i
		wl.Put(m)
	}

	wait.Wait()
	wl.Close()
}

在这个示例中,我们创建了一个写循环,然后将一些消息放入写循环。每个消息都会被 writeHandle 函数处理,如果在处理过程中发生错误,errorHandle 函数会被调用。在使用完写循环后,我们需要关闭它。