1. 程式人生 > >Erlang四大behaviour之三-gen_event

Erlang四大behaviour之三-gen_event

1. 事件處理規則

在OTP中,事件管理器是一個事件可以傳送到的命名物件,一個事件可以是一個錯誤、一個警告、或者一些要寫入日誌的資訊 在事件管理器中,有0個、一個或者多個事件處理器被安裝,當事件管理器被一個事件通知時,這個事件將被安裝在事件管理器中的事件處理器處理, 事件管理器用一個程序實現,事件處理器用回撥模組實現。事件管理器本質上維護一個{Module, State}列表,每一個Module為一個事件處理器,而State為事件處理器的內部狀態。

2. 例子

事件處理器的回撥模組把錯誤資訊寫入終端
 
12345678910 <span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">module</span><span style="color: rgb(16, 154, 184);">(</span>terminal_logger<span style="color: rgb(16, 154, 184);">)</span>
<span style="color: rgb(107, 184, 16);">.</span><span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">behaviour</span><span style="color: rgb(16, 154, 184);">(</span>gen_event<span style="color: rgb(16, 154, 184);">)</span>
<span style="color: rgb(107, 184, 16);">.</span><span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">export</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">[</span>init<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">1</span><span style="color: rgb(107, 184, 16);">,</span> handle_event<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">2</span><span style="color: rgb(107, 184, 16);">,</span> terminate<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">2</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span><span style="color: rgb(255, 60, 0);">init</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">_Args</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">-&gt;</span><span style="color: rgb(16, 154, 184);">{</span>ok<span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(16, 154, 184);">[</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">.</span><span style="color: rgb(255, 60, 0);">handle_event</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">ErrorMsg</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">State</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">-&gt;</span><span style="color: rgb(255, 78, 24);">io</span>:<span style="color: rgb(255, 60, 0);">format</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(255, 120, 0);">&quot;***Error*** ~p~n&quot;</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(16, 154, 184);">[</span><span style="color: rgb(69, 179, 230);">ErrorMsg</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(16, 154, 184);">{</span>ok<span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">State</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">.</span><span style="color: rgb(255, 60, 0);">terminate</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">_Args</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">_State</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">-&gt;</span><span style="color: rgb(0, 102, 0);">ok</span><span style="color: rgb(107, 184, 16);">.</span>
事件處理器的回撥模組把錯誤資訊寫入檔案
 
1234567891011 <span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">module</span><span style="color: rgb(16, 154, 184);">(</span>file_logger<span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span><span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">behaviour</span><span style="color: rgb(16, 154, 184);">(</span>gen_event<span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span><span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">export</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">[</span>init<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">1</span><span style="color: rgb(107, 184, 16);">,</span> handle_event<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">2</span><span style="color: rgb(107, 184, 16);">,</span> terminate<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">2</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span><span style="color: rgb(255, 60, 0);">init</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">File</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">-&gt;</span><span style="color: rgb(16, 154, 184);">{</span>ok<span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">Fd</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(1, 78, 164);">=</span><span style="color: rgb(255, 78, 24);">file</span>:<span style="color: rgb(255, 60, 0);">open</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">File</span><span style="color: rgb(107, 184, 16);">,</span> read<span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(16, 154, 184);">{</span>ok<span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">Fd</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">.</span><span style="color: rgb(255, 60, 0);">handle_event</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">ErrorMsg</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">Fd</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">-&gt;</span><span style="color: rgb(255, 78, 24);">io</span>:<span style="color: rgb(255, 60, 0);">format</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">Fd</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(255, 120, 0);">&quot;***Error*** ~p~n&quot;</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(16, 154, 184);">[</span><span style="color: rgb(69, 179, 230);">ErrorMsg</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(16, 154, 184);">{</span>ok<span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">Fd</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">.</span><span style="color: rgb(255, 60, 0);">terminate</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">_Args</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">Fd</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">-&gt;</span><span style="color: rgb(255, 78, 24);">file</span>:<span style="color: rgb(255, 60, 0);">close</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">Fd</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span>

3. 啟動事件管理器

呼叫
 
1 <span style="color: rgb(255, 78, 24);">gen_event</span>:<span style="color: rgb(255, 60, 0);">start_link</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">{</span>local<span style="color: rgb(107, 184, 16);">,</span> error_man<span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(16, 154, 184);">)</span>
啟動管理器,這個函式生成並連線到一個新程序,引數{local, error_man}指定名稱,在這個例子中,事件管理器被區域性註冊為error_man 假如忽略名稱,那麼事件管理器不會被註冊,它的PID將被使用。名稱也可以是這種形式{global, Name},這樣,事件管理器的名稱是用global:register_name/2註冊的。 假如事件管理器是監控樹的一部分,那麼gen_event:start_link必須被使用,也就是被監控樹啟動,而 gen_event:start啟動單獨的事件管理器,也就是事件管理器不是監控樹的一部分。

4. 新增事件處理器

下面的例子顯示怎樣啟動一個事件管理器和新增一個事件處理器
 
1234

相關推薦

Erlang四大behaviour-gen_event

1. 事件處理規則 在OTP中,事件管理器是一個事件可以傳送到的命名物件,一個事件可以是一個錯誤、一個警告、或者一些要寫入日誌的資訊 在事件管理器中,有0個、一個或者多個事件處理器被安裝,當事件管理器被一個事件通知時,這個事件將被安裝在事件管理器中的事件處理器處理, 事件管理器用一個程序實現,事件處理

erlang四大behaviour

今天介紹erlang的一個非常重要的behaviour,就是gen_fsm-有限狀態機,有限狀態機的作用非常之多,比如文字解析,模式匹配、 遊戲邏輯等等方面的處理都是它的強項,所以這個behaviour非常之重要 1. 有限狀態機 有限狀態機可以用下面這個公式來表達  

Erlang四大behaviour

1. 監督規則 一個監督者負責啟動、停止、監控他的子程序。監督者的一個基本概念就是當必要的時候重啟子程序保證它們的存活 哪個子程序要重啟和被監控是由一個子規程列表決定的,子程序按照列表中指定的順序啟動,並按相反的順序終止 2. 例項 監督者的回撥模組   <

Mybatis四大神器-刪除

現在學習Mybatis的刪除操作,步驟如下所示: 1.首先,在bao包中”TUser.java”介面新添刪除程式碼,程式碼如下: public int DeleteHuser(int id); 2.在entity包中“HUser.xml”中新添刪除欄位

VFS四大對象 struct dentry

多個 rect 註意 spin field lan 有一個 txt lru 繼上一篇文章介紹了inode結構體:繼續介紹目錄項dentry: 三、dentry結構體 目錄項:目錄項是描述文件的邏輯屬性,只存在於內存中,並沒有實際對應的磁盤上的描述,更確切的說是存在

Android 四大元件——Acitivity() 深入瞭解Activity的啟動流程

上圖為整個Activity的啟動流程 接下來我們大概分析  在我們的Android系統中,應用程式是由Launcher這個應用啟動起來的。當我們安裝好應用程式之後,就會在Launcher的介面上生成一個圖示,我們點選圖示時Launch就會啟動我們的應用程式。 1.點選

VCSA 6.5 HA配置 :準備工作

vmware vcenter ha 高可用 vcsa 接著上一篇文章部署完成VCSA 6.5後,還需要做一些準備工作才能開啟高可用功能,本篇文章主要就講述如何為vCenter 高可用進行準備工作配置vCenter HA網絡從vCenter HA的架構圖中可以看出對於vCenter HA的高

物聯網平臺構架系列:Amazon, Microsoft, IBM IoT 平臺導論 連接

物聯網; iot; aws; 亞馬遜; greengrass;microsoft; azure;ibm; watson; bluemix 最近研究了一些物聯網平臺技術資料,以做選型參考。腦子裏積累大量信息,便想寫出來做一些普及。作為科普文章,力爭通俗易懂,不確保概念嚴謹性。我會給考據癖者提供相關英文

Cisco層交換機

cisco 三層交換機一 三層交換機端口模式(默認為二層接口):二層接口:access模式、trunk模式三層接口:路由接口(no swithport)、SVI接口(虛接口)本文出自 “一萬年太久,只爭朝夕” 博客,請務必保留此出處http://zengwj1949.blog.51cto.com/107473

Hibernate態篇

結果 定義 tro 緩存 session nsa weight sys -c 一、概況 (一)瞬時狀態(暫時態) 在對象中假設對象剛被創建但沒有被持久化的話就是瞬時態 特點: (1) 不和 Session 實例關聯 (2)

遊戲制作大致流程粗談

結構 技能 地址 文件名 操作 圖片 提前 關卡 名單 這次的粗談主要細談遊戲策劃的七大步驟(來源文庫) 一:立項報告   1:了解公司現有的技術資源和技術能力。   2:分析目標消費群體,確定遊戲風格   3:確定基本玩法玩點、故事背景。   立項報告討論通過後

Linux學習:文件夾系統的結構和相對(絕對)路徑

sharp 二進制 沒有 數據 csharp pan 用戶 ont 臨時 理解每個目錄的作用 bin   二進制文件 boot   系統的啟動文件、內核 dev   設備文件 etc   配置文件 home  用戶的家目錄 lib    鏈接庫文件  l

CentOS7 下調教mysql記實

ase systemctl 服務器 exp span mes start lis centos7 我去,我的mysql在原Windows 2003服務器上好好的,遷移到linux下不能打開,跟蹤半天,發現表名大小寫的問題,windows不區分大小寫,linux區分。 解決

與其放在電腦裏占內存,還不如拿出來幫助一群小白白html篇

var wid gin ack document type solid load ntb <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> &

Coco2d-x 塔防遊戲“賊來了”開發簡檔 (完結)

遊戲開發 uml 塔防遊戲 賊來了 原來的教程為《塔防遊戲之賊來了》(這是我之前學習Cocos2d-x時候,看到的一個比較好的教程)原文地址目前只在泰然網看到,http://www.tairan.com/archives/6413 ,原作者為任珊。本文是基於這個教程,而編寫的遊戲開發簡檔,有了這些圖表,

跟KingDZ學HTML5 畫布Canvas

can 說明 padding phone 灰色 定義 ring explore 區域 繼續更新我們的教程,哈哈,個人覺得 ,這個HTML5 的官方 LOGO 怎麽看,怎麽像變形金剛。 神馬關系~~~~~~~~~~~ <Canvas> 是HTML5中新出現的一

python子進程模塊subprocess詳解與應用實例

app 命令執行 windows rom not tput 一個 網絡 shell命令 二、應用實例解析 2.1 subprocess模塊的使用 1. subprocess.call >>> subprocess.call(["ls", "-l"]) 0

夢斷代碼閱讀筆記

原因 設計 開始 微軟雅黑 戰爭 分鐘 導航 不足 family 今天我看到了本書的第九章,本章主要講了關於軟件開發的方法論。同時作者為我們介紹了軟件缺陷編年史上數量不多但是足以警示世人的驚人災難。 1962年6月,水手一號探測飛船在發射5分鐘後偏離軌道,

五大常用算法貪心算法

重疊 gets 一個 tar mon 沖突 array 最小值 貪心算法 貪心算法 貪心算法簡介:   貪心算法是指:在每一步求解的步驟中,它要求“貪婪”的選擇最佳操作,並希望通過一系列的最優選擇,能夠產生一個問題的(全局的)最優解。   貪心算法每一步必須滿足一下條件:

Java經典編程題50道

個數 [] -- ++ 要求 add example system oid 有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中。 public class Example30 { public static void main(String[] a