Day 28 |> Elixir 并行性 (二)

spawn

利用上一篇提到的 spawn 跟 send,可以做以下这个简单的范例,我们用Test.sum运行了一个行程,其中receive可以接收其他行程传来的讯息,利用尾递回的特性,直接不断呼叫 sum ,便可以一直进行监听,且不会造成记忆体爆炸。

用 pid 记录了行程的 id,再用 send 函式来传递讯息给行程,这样便完成了最简单的行程间的沟通了。

iex> defmodule Test do     
...>   def sum do      
...>     receive do
...>       [a, b] -> IO.inspect(a + b)
...>     end       
...>     sum
...>   end
...> end
{:module, Test,
 <<70, 79, 82, 49, 0, 0, 4, 228, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 142,
   0, 0, 0, 16, 11, 69, 108, 105, 120, 105, 114, 46, 84, 101, 115, 116, 8, 95,
   95, 105, 110, 102, 111, 95, 95, 7, 99, ...>>, {:sum, 0}}

iex> pid = spawn(Test, :sum, [])
#PID<0.417.0>

iex> send pid, [3, 6]           
9
[3, 6]

在 Elixir 中,最为人所知的应该是她在并行化处理方面的优化了,因此使用Process进行平行处理,在许多高处理量跟高延迟的工作下,应该可以取得不错的效果吧,因为 Elixir 的 Process 不会造成堵塞,意味着就算某个行程卡住或爆掉,其他行程也不会受到影响。


spawn_link

当我们希望知道 Process 程序崩溃时,可以使用 spawn_link 这个函式,来与子程序做连结(意思是可以接收到子行程的崩溃讯息。)


<<:  Day [28] Azure 认知服务-Custom Vision 建置

>>:  Day 30 整体心得及未来规划

TypeScript 能手养成之旅 Day 1 出发

TypeScript 能手养成之旅 Day 1 出发 前言 学习程序满一年了,转职成为工程师也有半年...

[Day24] Flutter - Application Login (part8)

前言 Hi, 我是鱼板伯爵这里我们要将Google登入与介面做连接,所以又要使用Bloc了,老样子按...

【Day 23】为美好的 Windows 献上 ETW - Event Tracing for Windows

环境 Windows 10 21H1 ETW 介绍 历史 ETW (Event Tracing fo...

[Day 32] 自我介绍後台及前台(一) - 取得使用者资料

自我介绍後台及前台 自定义性别 我们现在要开始做自我介绍的後台部分, 在这里我们要先建一个Enum,...

30-9 之Presentation Layer - MVP ( Model-View-Presenter )

接下来我们来谈谈 MVP ( Model-View-Presenter ),在知道 MVC 也只是在...