本文微信公衆号連結:https://mp.weixin.qq.com/s/_p6bnUegQmHb8NbAccPQyw
actor是一種異步并發處理模型。最具代表性的是erlang語言。
在golang中,最具代表性的并發模式為csp,多協程并發。
這兩者的差別更多類似于網絡并發。網絡程式設計中的并發複雜性 這篇文章中有介紹,關于事件驅動和多線程并發。其兩者都有着各自的優缺點。
protoactor-go的源碼位址為:
https://github.com/AsynkronIT/protoactor-go
對于一個大型的項目來講,我個人的學習習慣于從最小版本開始學起。這是因為,在一個項目最初的時候,大體功能和架構都已經成形,最初的版本,一般來說,代碼量都較少,功能集最小。學習曲線低,并且又最初版本,慢慢往高版本過渡,也能更了解項目進化的過程,也是一個學習的過程。
并且在實際使用過程中,大多數情況下,我們可能不需要那麼多的功能集,并且需要根據實際情況做一些二次開發,此時的話,也許低版本的會更貼近實際使用場景和二次開發場景。
現在從最初版本開始,由于protoactor-go的源碼并未有版本标簽。是以以其上傳代碼的送出代号加以區分。

- 送出:e866f394306402cbad4cbc47c29f4353cb3cffc3 [e866f39]
- 父級:ffa6e56943
- 作者:rogeralsing <[email protected]>
- 日期:2016年4月18日 GMT+8 上午3:09:35
- 标簽:HEAD
源碼隻有一個main檔案,代碼量非常少。
github.com/AsynkronIT/protoactor-go/main.go
main函數。根據main函數中的調用流程整理出流程圖如下:
ActorRef将消息發送給排程部分
排程部分根據消息類型,調用ActorCell的不同處理部分
ActorCell調用Actor子產品對消息進行處理
具體子產品代碼:
1、ActorRef
ActorRef是提供的架構的使用接口
ChannelActorRef,是用Channel來實作消息的投遞
2、Actor
Actor是真正接收消息的處理部分
一個Actor執行個體,MyActor,必須實作接口Receive,在Receive中,有對接收到的消息進行處理。
3、ActorCell
ActorCell是一個中間部件,聯結排程部分與Actor部分
4、
Acotrof,有兩個功能:
1)36-45:排程的初始化,以及ActorRef的建構
2)46-61:排程部分,消息的接收與分發傳遞處理
總結:
這是protoactor-go上傳代碼中,最初的版本,通過channel實作了一個最基本的Actor模型。代碼簡潔,功能單一,但子產品劃厘清晰。
此源碼是應讀者需求進行分析。後續還會有protoactor-go更多版本的源碼分析。
龔浩華
月牙寂道長
qq:29185807
2019年05月12日
如果你覺得本文對你有幫助,可以轉到你的朋友圈,讓更多人一起學習。
第一時間擷取文章,可以關注本人公衆号:月牙寂道長,也可以掃碼關注