Skip to content
/ go-queue Public

A thread-safe collections for memory/disk queues (FIFO), stacks (LIFO) and priority by Go.

License

Notifications You must be signed in to change notification settings

czasg/go-queue

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
czasg
May 28, 2022
413f3a6 · May 28, 2022

History

50 Commits
Nov 16, 2021
Nov 5, 2021
Nov 5, 2021
May 28, 2022
May 27, 2022
May 25, 2022
May 25, 2022
May 25, 2022
Nov 7, 2021
May 26, 2022
May 25, 2022
May 26, 2022
May 25, 2022
May 25, 2022
May 25, 2022

Repository files navigation

go-queue

LICENSE codecov GitHub Stars GitHub Forks GitHub Issue

1.背景

在 go 中,存在 chan 这种天然的 FIFO 队列。
但类似 LIFO、持久化 等特殊结构/能力,并没有通用的标准库,更多的是借用三方软件来实现。

go-queue 定义了简单的队列标准,提供了 FIFO、LIFO、持久化 等能力。

2.目标

1、内存队列、磁盘队列

  • FIFO Memory Queue - 内存队列
  • LIFO Memory Queue - 内存队列
  • FIFO Disk Queue - 磁盘队列
  • LIFO Disk Queue - 磁盘队列

2、Get/Put 支持阻塞,磁盘队列可不支持

  • FIFO Block Memory Queue - 内存队列支持阻塞
  • LIFO Block Memory Queue - 内存队列支持阻塞

3.使用

1、初始化队列

// 依赖
import "github.com/czasg/go-queue"

// 初始化内存队列
_ = queue.NewFifoMemoryQueue() 
_ = queue.NewLifoMemoryQueue(2048) 

// 初始化磁盘队列,需要指定目标文件
var fifofilename, lifofilename string
_, _ = queue.NewFifoDiskQueue(fifofilename)
_, _ = queue.NewLifoDiskQueue(lifofilename)

2、推送数据

q := queue.NewFifoMemoryQueue() 
// 非阻塞
_ = q.Put(nil, []byte("data"))
// 阻塞
_ = q.Put(context.Background(), []byte("data"))

3、获取数据

q := queue.NewFifoMemoryQueue() 
// 非阻塞
_, _ = q.Get(nil)
// 阻塞
_, _ = q.Get(context.Background())

4、关闭队列

q := queue.NewFifoMemoryQueue() 
q.Close()

特别是磁盘队列,使用完后务必确保关闭。否则会出现文件损坏问题。

4.队列接口

type Queue interface {
    Get(ctx context.Context) ([]byte, error)
    Put(ctx context.Context, data []byte) error
    Len() int
    Close() error
}

其中上下文context.Context用于决定此次Get / Put是否阻塞。

5.Demo

FIFO Memory Queue

package main

import (
    "context"
    "fmt"
    "github.com/czasg/go-queue"
    "time"
)

func main() {
    q := queue.NewFifoMemoryQueue()
    _ = q.Put(nil, []byte("go-queue"))
    data, _ := q.Get(nil)
    fmt.Println("非阻塞获取数据", string(data))

    go func() {
        data, _ := q.Get(context.Background())
        fmt.Println("阻塞获取数据", string(data))
    }()
    time.Sleep(time.Second * 2)
    _ = q.Put(nil, []byte("go-queue"))
    time.Sleep(time.Millisecond)
    q.Close()
}

LIFO Memory Queue

package main

import (
    "context"
    "fmt"
    "github.com/czasg/go-queue"
    "time"
)

func main() {
    q := queue.NewLifoMemoryQueue()
    _ = q.Put(nil, []byte("go-queue"))
    data, _ := q.Get(nil)
    fmt.Println("非阻塞获取数据", string(data))

    go func() {
        data, _ := q.Get(context.Background())
        fmt.Println("阻塞获取数据", string(data))
    }()
    time.Sleep(time.Second * 2)
    _ = q.Put(nil, []byte("go-queue"))
    time.Sleep(time.Millisecond)
    q.Close()
}

FIFO Disk Queue

package main

import (
    "fmt"
    "github.com/czasg/go-queue"
    "io/ioutil"
    "os"
)

func main() {
    file, err := ioutil.TempFile("", "")
    if err != nil {
        panic(err)
    }
    defer os.RemoveAll(file.Name())
    file.Close()

    q, _ := queue.NewFifoDiskQueue(file.Name())
    _ = q.Put(nil, []byte("go-queue"))
    q.Close()

    q, _ = queue.NewFifoDiskQueue(file.Name())
    data, _ := q.Get(nil)
    fmt.Println("获取数据", string(data))
    q.Close()
}

LIFO Disk Queue

package main

import (
    "fmt"
    "github.com/czasg/go-queue"
    "io/ioutil"
    "os"
)

func main() {
    file, err := ioutil.TempFile("", "")
    if err != nil {
        panic(err)
    }
    defer os.RemoveAll(file.Name())
    file.Close()

    q, _ := queue.NewLifoDiskQueue(file.Name())
    _ = q.Put(nil, []byte("go-queue"))
    q.Close()

    q, _ = queue.NewLifoDiskQueue(file.Name())
    data, _ := q.Get(nil)
    fmt.Println("获取数据", string(data))
    q.Close()
}

About

A thread-safe collections for memory/disk queues (FIFO), stacks (LIFO) and priority by Go.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages