iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
Modern Web

Phoenix 1.7 完全教學系列 第 20

20 Elixir Process

  • 分享至 

  • xImage
  •  

什麼是 Elixir Process

在進入 LiveView 章節之前,我們先來看看 Elixir Process 是什麼。

Elixir 跑在 Erlang VM (BEAM) 上,我們每次執行程式都會由一個 Process 負責,BEAM 裡的 process 與 CPU 的 process 或 thread 不同,Process 相當輕量,且每個 Process 之間都有獨立的記憶體空間,每個 Process 附有一個用來找到彼此的 PID (Process ID),與接受傳遞訊息的 Mailbox。

https://ithelp.ithome.com.tw/upload/images/20231005/20141054ru6vYEd4oY.png

在一個有四核心的機器裡,BEAM 預設會開啟與 CPU 數量相同的 scheduler,可以想像是一個有很多 process 的大池子,有四個 scheduler 在處理所有的工作項目(process)
(實際上是四個工作列,但 shceduler 會自動分配工作量,所以我們可以想像成一個大池子)

https://ithelp.ithome.com.tw/upload/images/20231005/20141054BdyevUjJMH.png

每一個 Process 在處理一個固定的工作量後,就會暫停再度被放到池子上方,直到下一次輪到他執行。
(工作量是使用 reduction 計算,預設為 2000 次。)

https://ithelp.ithome.com.tw/upload/images/20231005/20141054ZWpnI0CCgg.png

由於 process 輕量切換快速,且整個機制是內建在語言層級,所以我們可以放心且容易的建立大量的 process。

Controller-View 的 Process 情形

在 Controller-View 的架構下,每一個 request 都會被分配到一個 process 處理,這個 process 會負責處理整個 request 的生命週期,找到對應的 route 與 controller,並執行 controller 裡的動作,最後回傳網頁給 client,完成後就會結束這個 process。

https://ithelp.ithome.com.tw/upload/images/20231005/20141054XGApHmWn23.png

LiveView 的 Process 情形

在我們即將要提到的 LiveView 裡,每一個 client 會被分配到一個 process,這個 process 會一直活著並且用 websocket 連結著 client 端。因為建立在 BEAM 這個特別為大量 process 設計的 VM 上,所以 LiveView 可以輕易的維持大量的 process 來服務等同數量的 client。

https://ithelp.ithome.com.tw/upload/images/20231005/20141054izOmjug2qX.png

非同步處理

由於整個語言已經內建了優秀的非同步處理機制,我們可以輕易的建立一個 process 來處理非同步的工作,例如寄信、處理大量的資料、或是與其他服務溝通等等。

https://ithelp.ithome.com.tw/upload/images/20231005/20141054dVfsfdvCkr.png

(雖然 Erlang 在設計時沒有參考 Actor Model,但是巧合的符合了 Actor Model 的設計。)


上一篇
19 刪除與 link component
下一篇
21 LiveView 簡單的互動頁面
系列文
Phoenix 1.7 完全教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言