天天看點

開源代碼protoactor-go[e866f39]源碼分析

本文微信公衆号連結:https://mp.weixin.qq.com/s/_p6bnUegQmHb8NbAccPQyw

actor是一種異步并發處理模型。最具代表性的是erlang語言。

在golang中,最具代表性的并發模式為csp,多協程并發。

這兩者的差別更多類似于網絡并發。網絡程式設計中的并發複雜性 這篇文章中有介紹,關于事件驅動和多線程并發。其兩者都有着各自的優缺點。

protoactor-go的源碼位址為:

https://github.com/AsynkronIT/protoactor-go

對于一個大型的項目來講,我個人的學習習慣于從最小版本開始學起。這是因為,在一個項目最初的時候,大體功能和架構都已經成形,最初的版本,一般來說,代碼量都較少,功能集最小。學習曲線低,并且又最初版本,慢慢往高版本過渡,也能更了解項目進化的過程,也是一個學習的過程。

    并且在實際使用過程中,大多數情況下,我們可能不需要那麼多的功能集,并且需要根據實際情況做一些二次開發,此時的話,也許低版本的會更貼近實際使用場景和二次開發場景。

現在從最初版本開始,由于protoactor-go的源碼并未有版本标簽。是以以其上傳代碼的送出代号加以區分。

開源代碼protoactor-go[e866f39]源碼分析
  • 送出:e866f394306402cbad4cbc47c29f4353cb3cffc3 [e866f39]
  • 父級:ffa6e56943
  • 作者:rogeralsing <[email protected]>
  • 日期:2016年4月18日 GMT+8 上午3:09:35
  • 标簽:HEAD

源碼隻有一個main檔案,代碼量非常少。

github.com/AsynkronIT/protoactor-go/main.go

開源代碼protoactor-go[e866f39]源碼分析

main函數。根據main函數中的調用流程整理出流程圖如下:

開源代碼protoactor-go[e866f39]源碼分析

ActorRef将消息發送給排程部分

開源代碼protoactor-go[e866f39]源碼分析

排程部分根據消息類型,調用ActorCell的不同處理部分

開源代碼protoactor-go[e866f39]源碼分析

ActorCell調用Actor子產品對消息進行處理

具體子產品代碼:

1、ActorRef

開源代碼protoactor-go[e866f39]源碼分析

ActorRef是提供的架構的使用接口

開源代碼protoactor-go[e866f39]源碼分析

ChannelActorRef,是用Channel來實作消息的投遞

2、Actor

開源代碼protoactor-go[e866f39]源碼分析

Actor是真正接收消息的處理部分

開源代碼protoactor-go[e866f39]源碼分析

一個Actor執行個體,MyActor,必須實作接口Receive,在Receive中,有對接收到的消息進行處理。

3、ActorCell

開源代碼protoactor-go[e866f39]源碼分析

ActorCell是一個中間部件,聯結排程部分與Actor部分

4、

開源代碼protoactor-go[e866f39]源碼分析

Acotrof,有兩個功能:

1)36-45:排程的初始化,以及ActorRef的建構

2)46-61:排程部分,消息的接收與分發傳遞處理

總結:

這是protoactor-go上傳代碼中,最初的版本,通過channel實作了一個最基本的Actor模型。代碼簡潔,功能單一,但子產品劃厘清晰。

此源碼是應讀者需求進行分析。後續還會有protoactor-go更多版本的源碼分析。

龔浩華

月牙寂道長

qq:29185807

2019年05月12日

如果你覺得本文對你有幫助,可以轉到你的朋友圈,讓更多人一起學習。

第一時間擷取文章,可以關注本人公衆号:月牙寂道長,也可以掃碼關注

開源代碼protoactor-go[e866f39]源碼分析