shm

package module
v0.0.0-...-8301186 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 7, 2021 License: MIT Imports: 9 Imported by: 0

README

Golang 共享内存

  • golang 中使用共享内存

简介

  • 支持的共享内存类型

    • systemV
    • mmap
  • 两种应用场景

    • 只可以是一个生产者 & 一个消费者(NewSingleShm 构造函数)
    • 可以 多个生产者 & 一个消费者(NewMultiShm 构造函数)
  • 具体的实现思路是基于范健的这篇分享,在此也感谢作者

  • 上述分享主要是一个无锁队列的实现,我在此基础上套上了一层共享内存

安装

go get github.com/892294101/mshm

使用

创建共享内存块
// system V
mem, err := shm.NewSystemVMem(6, 10000)
if err != nil {
    log.Fatal(err)
}

// mmap
mem, err := shm.NewMMapMem("./test.txt", 10000)
if err != nil {
    log.Fatal(err)
}
使用
package main

import (
	"fmt"
	"log"

	"github.com/892294101/mshm"
)

type LogItem struct {
	ProtocolName string
	Fields       []string
	Data         []interface{}
}

func testConstructor() interface{} {
	return &LogItem{}
}

func main() {
    // 构造共享内存块
    // 如果需要使用 mmap 共享内存,使用 NewMMapMem 构造方法即可
	mem, err := shm.NewSystemVMem(6, 10000)
	if err != nil {
		log.Fatal(err)
	}

	s, err := shm.NewMultiShm(mem, 10000, testConstructor)
	if err != nil {
		fmt.Println(err)
		return
	}

	for i := 0; i < 10; i++ {
		item := &LogItem{
			ProtocolName: "1",
			Fields:       []string{fmt.Sprintf("field-%d", i)},
			Data:         []interface{}{i},
		}
		if err := s.Save(item); err != nil {
			fmt.Println(err)
			return
		}
	}

	items, err := s.Get()
	if err != nil {
		fmt.Println(err)
		return
	}

	for _, v := range items {
		fmt.Printf("value : %v, type = %T\n", v, v)
	}
}
使用订阅使用
package main

import (
	"fmt"
	"log"

	"github.com/892294101/mshm"
)

func callBack(*shmdata.TagTLV){
    //do something
}

func main(){
    if shm.StartSubscribe(999999, callBack) {
        fmt.Println("start alert shm success")
    }else{
        fmt.Println("start alert shm failed")
    }
    if shm.StartSubscribe(888888, callBack) {
        fmt.Println("start log shm success")
    }else{
        fmt.Println("start log shm failed")
    }
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetSHMInfo

func GetSHMInfo(key, size int) (*reflect.SliceHeader, error)

func NewMMapMem

func NewMMapMem(path string, size int) (*model.Mem, error)

func NewSystemVMem

func NewSystemVMem(key, size int) (*model.Mem, error)

Types

type ConstructorFunc

type ConstructorFunc func() interface{}

type SHM

type SHM struct {
	// contains filtered or unexported fields
}

func NewMultiShm

func NewMultiShm(shm *model.Mem, size int, constructor ConstructorFunc) (*SHM, error)

func NewSingleShm

func NewSingleShm(shm *model.Mem, size int, constructor ConstructorFunc) (*SHM, error)

func (*SHM) Get

func (s *SHM) Get() ([]interface{}, error)

func (*SHM) GetByIndex

func (s *SHM) GetByIndex(index int) (interface{}, error)

func (*SHM) Save

func (s *SHM) Save(i interface{}) error

Directories

Path Synopsis
example
shm

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL