在這邊指的 Process 與系統的 process 不同,是指在 BEAM VM (erlang 的 VM) 裡執行的輕量級、獨立運行的執行單元 (其實就是 Actor model 的一個 actor),每一個 process 都互相隔離,各有自己的記憶體空間,一個 process 無法直接修改別的 process 狀態。每個 process 都相當輕量,在一個 app 中有上萬個 process 同時運行是很正常的。
所有的 porcesses 可以視為同時運行的 (底下當然沒有,畢竟 cpu 就那幾顆,詳細機制後續章節再細看)
我們在終端機啟動的互動介面 iex 打開時本身就是一個 process
每一個 process 都有一個 PID 這個 PID 不僅在單機上,如果由多個 Node 連成 cluster 時,每個 PID 也依然是獨一無二的,我們可以執行 self/0
來得到目前 process 的 PID
在 iex 中執行 self()
self()
#PID<0.108.0>
若要產生一個 process,最簡單的方法是使用 spawn/1
以下為產生一個新的 process 並請他執行 Process.sleep(5000)
暫停五秒,再吐出訊息
spawn(fn ->
Process.sleep(5000)
IO.puts("睡飽了")
end)
因為是另一個 process ,所以並不會阻擋我們的 iex 運行,如果直接在 iex 執行 Process.sleep(5000)
,這個 iex 互動介面會真的卡五秒後才能繼續輸入指令。