文章目录
erlang教程: 基础入门🔥 编程基础🔥 数据结构🔥 递归🔥 并发编程
elixir教程: 基础入门🔥 编程基础🔥 模式匹配🔥 递归枚举
spwan
elixir继承了erlang的高并发特性,提供轻量且易用的多进程编程方法,通过spawn函数调用函数,就可以实现新进程的开启。
iex(1)> spawn(fn -> 1+2 end) #PID<0.108.0>
其中fn->1+2 end
是一个匿名函数,通过spawn
调用之后,会返回一个进程号。通过self
函数,可以得到主进程的ID
iex(2)> self() #PID<0.106.0>
为了检测进程是否存在,可以通过Process.alive
函数
iex(3)> pid = spawn(fn -> 1+2 end) #PID<0.110.0> iex(4)> Process.alive?(pid) false
进程通信
elixir中,通过send, recieve
来完成进程通信,示例如下
# 文件Example.ex defmodule Example do def listen do receive do {
:ok, "hello"} -> IO.puts("world") end listen() end end
其功能是,当有进程发送:ok
这个原子以及"Hello"
这个字符串的时候,输出"world"
。
正常来说,作为某个监听进程,监听函数必然要放在一个死循环里,但elixir并不支持循环,所以在listen的最后一行又调用了自身,即通过递归的方式创建了一个永不停歇的监听工具。
接下来在命令行中调用,效果如下
>iex Example.ex iex(1)> pid = spawn(Example, :listen, []) #PID<0.113.0> iex(2)> send pid, {
:ok, "hello"} world {
:ok, "hello"} iex(3)> send pid, {
:ok, "hello"} world {
:ok, "hello"} iex(4)> send pid, {
:ok, "hell"} {
:ok, "hell"}
其中spawn
函数与之前开启进程的时候稍有区别,即这回是从模块中调用函数,所以spawn
的输入参数变成了3个,分别是模块名,模块中的函数名,以及函数参数。新进程创建之后,被赋予给pid
。
然后,通过send
函数向pid
发送消息,连发两次,两次的结果都返回了world
,说明listen
函数一直在工作,递归写法起到了作用。但第三次发送时,"hello"
并没有匹配上,所以也就没继续输出world
了。
如果想关闭这个进程,那么可以通过Process.exit
函数
iex(5)> Process.exit(pid, :kill) true iex(6)> send pid, {:ok, "hello"} {:ok, "hello"}
通过标识原子:kill
来让pid
这个进程被关闭,这样即便再向其发送:ok
,也不会再有回复了,而且调用Process.alive?
也可以查看进程的死活。
spawn_link
由于进程之间是单独运行的,彼此并不相干,所以一个进程崩掉,对另一个进程并不会有影响。如果希望进程错误可以被链接到父进程中,则可用spawn_link函数取代spawn函数。
下面再命令行中测试一下这两个函数的差异
iex(1)> spawn(fn -> 1/0 end) #PID<0.109.0> iex(2)> 22:25:45.267 [error] Process #PID<0.109.0> raised an exception (ArithmeticError) bad argument in arithmetic expression :erlang./(1, 0) iex:1: (file)
在上面的代码中1/0是必然会报错的,而通过spawn开启新进程调用这个错误的函数,最终尽管也报错了,但主进程并没有受到影响。
接下来通过spawn_link函数重新尝试一下
iex(2)> spawn_link(fn -> 1/0 end) 22:25:54.750 [error] Process #PID<0.111.0> raised an exception (ArithmeticError) bad argument in arithmetic expression :erlang./(1, 0) iex:2: (file) (EXIT from #PID<0.106.0>) shell process exited with reason: an exception was raised: (ArithmeticError) bad argument in arithmetic expression :erlang./(1, 0) iex:2: (file) Interactive Elixir (1.14.4) - press Ctrl+C to exit (type h() ENTER for help) iex(1)>
可以发现除了进程报错之外,shell
所在进程也出现了问题,最后不得不重启命令行,代码又从iex(1)
开始了。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/elixirbfbc/2398.html