caf圖層特性?
. caf的主要特性
1. actor
actor分為兩種, 無類型actor和強類型actor. actor的創建非常簡單, 簡單到不能再簡單了, 以下面的例子. 將1個自由函數作為參數傳遞spawn,
1個actor就生成了, 在下面的例子中actorx內部持有1個actor的句柄self. 所有與這個actor有關的消息都從這里開始.
void actorx(event_based_actor* self) { } spawn(actorx);2. 模式匹配.
模式匹配是caf中1個10分重要的特性, 它直接致使了caf基于lambda表達式的消息回調列表成為可能. caf為此自己內建了DSL語言來達成這個目的.
下面效果就是來自模式匹配.
void actorx(event_based_actor* self) { self->become( [=](const string& what) { LOG_DEBUG("got a string msg: %s ", what.c_str()) }, [=](const int& what) { LOG_DEBUG("got integer msg: %d ", what) }); } auto a = spawn(actorx); anon_send(a, "string"); /* 向actor發送1個字符串. */ anon_send(a, 0x10); /* 向actor發送1個整數. */
需要說明的是, 上面的例子中actorx函數是立即返回的, 也就是說里面的become也是立即返回的, 好像把兩個消息處理回調放在actorx函數內部.
當有消息到來時, 經模式匹配后就會調用恰當的lambda表達式. 不用再到處找回調了.
3. 消息發送.
消息發送可以分為以下幾種:
a). 發完就忘, 就像上面anon_send.
b). 同步發送, 等待響應. 等待是異步的, 相當于只是期待1個響應.
c). 同步發送, 等待響應, 超時后收到1個系統消息.
d). 同步發送, 同步等待. 適用阻塞的actor api.
e). 消息延遲發送, 這1點比akka做得漂亮很多.
f). 消息前轉, forward.
g). 消息優先級選擇.
4. 消息接收.
主要有兩種特性:
a). 等待超時, 超時后收到1個系統消息.
b). 消息跳過, skip.
5. 行動(behavior)
如果actor的消息流程是1個有限狀態機, 那行動就是用來控制流程的標志. behavior是1個棧, 通過keep_behavior壓棧, unbecome恢復.
6. 鏈接(link)
兩個(或多個)actor可以相互link在1起, 生死相干. 1起活著或默許1起死去.
當其中1個actor異常退出時, 另外一個(多是多個)會收到1個"exit_msg"消息, 如果不捕獲這個消息. 默許的行動就是當前actor也退出.
如果選擇捕獲, 那就自己定義行動.
7. 監視(monitor)
1個actor可選擇監視另外一個或另幾個actor. 乃至可以同時監視同1個actor屢次. 當被監視的actor退出時, 監視者就會收到1個"down_msg".
監視者僅僅是收到這個消息而已. 不會有其它對自己的響應. 需自己定義行動.
8. 在網絡上發布1個actor.
這個功能貌似還非常骨感, 其做法是調用pubish函數將1個actor綁定在某個本地端口上, 作為服務器向外提供服務. 以下面的端口8080, 端口
后面還有1個默許的字符串參數, 允許指定本地服務ip.