当前位置: 代码迷 >> 综合 >> 商业公链之区块链技术使用的常见库(五)------Go语言并发actor库github.com/AsynkronIT/protoactor-go/actor
  详细解决方案

商业公链之区块链技术使用的常见库(五)------Go语言并发actor库github.com/AsynkronIT/protoactor-go/actor

热度:38   发布时间:2023-12-10 18:08:48.0

Go语言并发actor库"github.com/AsynkronIT/protoactor-go/actor"

ProtoAct 是下一代的 Actor 模型框架,提供了 .NET 和 Go 语言的实现,默认支持分布式,提供管理和监控功能。Proto.Actor 提供了可伸缩、实时的事务处理,任何需要高吞吐量、低延迟的业务需求都可以用到Proto.Actor 。目前该版本处于开发状态中,并不太适合生产状态,可能示例源码会在后边发生改变,需要在example中寻找最新代码。

Actor作为一个进程,可以接受或发生消息到其他actor,其他actor基于消息产生活动。也就是说每一个actor都是独立的进程,多个actor运行支持了高并发情形。解决了锁的问题。

1.安装actor:

go get "github.com/AsynkronIT/protoactor-go/actor"              

2.引入actor:

import "github.com/AsynkronIT/protoactor-go/actor"

3.规定交流消息结构:

type Hello struct{ Who string }

4.新的actor结构:

type HelloActor struct{}

5.actor绑定一个receive方法处理接收到邮箱的信息:

func (state *HelloActor) Receive(context actor.Context) {

switch msg := context.Message().(type) { //按时间顺序读取邮箱

case Hello:                               //hello消息

fmt.Printf("Hello %v\n", msg.Who) //读取消息结构who内容

}

}

6.获得默认空白的上下文环境:context := actor.EmptyRootContext

7.使用actor结构获得actor对象得到actor模板:props := actor.PropsFromProducer(func() actor.Actor { return &HelloActor{} })

8.基于模板创建实例并返回一个pid,该pid与新邮箱关联:pid := context.Spawn(props)

9.在当前上下文环境发送消息至该pid:context.Send(pid,Hello{Who: "Roger"})

10.读取缓冲区并打印一行:console.ReadLine()

11.停止进程:pid.Stop()

12.监听进程状态改变:

switch msg := context.Message().(type) {

case *actor.Started: //actor开始状态

fmt.Println("Started, initialize actor here")

case *actor.Stopping: //正在停止状态

fmt.Println("Stopping, actor is about shut down")

case *actor.Stopped: //已经停止状态

fmt.Println("Stopped, actor and its children are stopped")

case *actor.Restarting: //重启状态

fmt.Println("Restarting, actor is about restart")

case Hello: //匹配hello

fmt.Printf("Hello %v\n", msg.Who)

}

10. 行为模板结构:

type SetBehaviorActor struct {

behavior actor.Behavior

}

14.初始化actor数据结构,生成actor对象,绑定actor行为

func NewSetBehaviorActor() actor.Actor {

act := &SetBehaviorActor{

behavior: actor.NewBehavior(), //行为模板

}

act.behavior.Become(act.One) //行为方法

return act

}

15.绑定actor对应的receive方法,方法设置接受消息后执行对应的行为:

func (state *SetBehaviorActor) Receive(context actor.Context) {

state.behavior.Receive(context) //执行行为

}

16.行为方法:

case Hello:

fmt.Printf("Hello %v\n", msg.Who)

state.behavior.Become(state.Other) //改变行为

}

示例源码:阅读原文,用法文档:https://godoc.org/github.com/AsynkronIT/protoactor-go

希望大家关注我的微信公众号,推荐给更多技术极客,日更一篇区块链技术博客不易,有疑问可以后台留言。 

  相关解决方案