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

Erlang四大behaviour之四

1. 監督規則

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

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>ch_sup<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>supervisor<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>start_link<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">0</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(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(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);">start_link</span><span style="color: rgb(16, 154, 184);">(</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);">supervisor</span>:<span style="color: rgb(255, 60, 0);">start_link</span><span style="color: rgb(16, 154, 184);">(</span>ch_sup<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);">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>one_for_one<span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(255, 150, 0);">1</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(255, 150, 0);">60</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><span style="color: rgb(16, 154, 184);">{</span>ch3<span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(16, 154, 184);">{</span>ch3<span style="color: rgb(107, 184, 16);">,</span> start_link<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>            permanent<span style="color: rgb(107, 184, 16);">,</span> brutal_kill<span style="color: rgb(107, 184, 16);">,</span> worker<span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(16, 154, 184);">[</span>ch3<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(16, 154, 184);">}</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">.</span>
one_for_one是重啟策略1和60定義了最大重啟頻率{ch3, …}是子規程

3. 重啟策略

one_for_one 假如一個程序終止了,僅僅這個程序會被重啟
one_for_all
假如一個程序停止了,所有其他子程序也要被停止,然後所有子程序,包括這個引發停止的子程序都被重啟 rest_for_one 假如一個程序停止了,它後面的子程序,也就是以啟動順序來說這個被終止的程序後面的子程序都將被停止,然後他們又被啟動。

4. 最大啟動頻率

監督者有一個內建機制限制在給定的時間間隔裡的重啟次數,這由子程序啟動規程中的兩個引數值決定,MaxR和MaxT,它們定義在回撥函式init 中
 
123 <span style="color: rgb(255, 60, 0);">init</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><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(69, 179, 230);">RestartStrategy</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">MaxR</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">MaxT</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><span style="color: rgb(69, 179, 230);">ChildSpec</span><span style="color: rgb(107, 184, 16);">,</span><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>
如果在時間MaxT裡重啟次數大於MaxR ,監督者程序就停止它所有子程序,然後再終止自己。 當監督者程序終止了,那麼更高級別的監督者要採取些動作,它或者重啟被終止的監督者或者停止自己 這個重啟機制的目的是預防一個程序因某種原因頻繁的終止,然後簡單的重啟。

5. 子規範

下面的是型別定義
 
12345678910 <span style="color: rgb(16, 154, 184);">{</span><span style="color: rgb(69, 179, 230);">Id</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">StartFunc</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">Restart</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">Shutdown</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">Type</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">Modules</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(69, 179, 230);">Id</span><span style="color: rgb(1, 78, 164);">=</span><span style="color: rgb(255, 60, 0);">term</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(69, 179, 230);">StartFunc</span><span style="color: rgb(1, 78, 164);">=</span><span style="color: rgb(16, 154, 184);">{</span><span style="color: rgb(69, 179, 230);">M</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">F</span><span style="color: rgb(107, 184, 16);">,</span><span style="color: rgb(69, 179, 230);">A</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(69, 179, 230);">M</span><span style="color: rgb(1, 78, 164);">=</span><span style="color: rgb(69, 179, 230);">F</span><span style="color: rgb(1, 78, 164);">=</span><span style="color: rgb(255, 60, 0);">atom</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(69, 179, 230);">A</span><span style="color: rgb(1, 78, 164);">=</span><span style="color: rgb(16, 154, 184);">[</span><span style="color: rgb(255, 60, 0);">term</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(69, 179, 230);">Restart</span><span style="color: rgb(1, 78, 164);">=</span> permanent | transient | temporary<span style="color: rgb(69, 179, 230);">Shutdown</span><span style="color: rgb(1, 78, 164);">=</span> brutal_kill | <span style="color: rgb(255, 60, 0);">integer</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">)</span> &amp;gt<span style="color: rgb(107, 184, 16);">;</span><span style="color: rgb(1, 78, 164);">=</span><span style="color: rgb(255, 150, 0);">0</span> | infinity<span style="color: rgb(69, 179, 230);">Type</span><span style="color: rgb(1, 78, 164);">=</span> worker | supervisor<span style="color: rgb(69, 179, 230);">Modules</span><span style="color: rgb(1, 78, 164);">=</span><span style="color: rgb(16, 154, 184);">[</span><span style="color: rgb(69, 179, 230);">Module</span><span style="color: rgb(16, 154, 184);">]</span> | dynamic<span style="color: rgb(69, 179, 230);">Module</span><span style="color: rgb(1, 78, 164);">=</span><span style="color: rgb(255, 60, 0);">atom</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);"