erlang的spawn函数

问:

1. spawn(fun() -> loop() end).
2. spawn(loop()).
语句1和2到底有什么区别? 2会阻塞,1不会, spawn到底是怎么执行的?? 过程能否说详细点.

loop() ->
receive
    ok -> ok, loop();
    stop -> stop
end.

答1:

我也碰到这个问题,搜索到这个帖子,但2楼也没解释好。我找到原因了,写清楚一点,让以后的网友知道。

要用: spawn(fun loop/0 end). 的形式才行。如果写 loop() ,机器会认为是:“loop()的返回值”,而不是一个函数名。

等下,这又有个问题:如果loop函数是要有参数的函数,loop/1 显然也没法写参数,不能成功。所以spawn函数里写 fun() -> ff(X,Y,Z) end. 这形式是个好习惯。

答2:

erlang里面一切都是表达式,表达式肯定会有个计算结果,你表达式本身就阻塞了,调用它的就一直等着他返回结果,再spawn,而用fun的话直接返回#fun<>,并发一个进程出去等着表达式返回结果。明白这个道理就好了

时间: 2024-11-05 23:47:54

erlang的spawn函数的相关文章

Erlang高阶函数

对于函数式语言来说,函数也想普通的数据类型一样无处不在.函数即可以当成参数进行传递,也可以当成函数的返回值.当我第一次学习函数式编程的时候,我被这样的写法弄的头昏脑涨.下面我举例说明下(例子摘录自Learn You Some Erlang): 假如你想对一个列表中的所有值都进行加1或减1的操作,那么不熟悉函数式编程者给出的是如下的程序: -module(hhfuns). -compile(export_all). increment([]) -> []; increment([H|T]) ->

erlang实现zipwith函数

实现一个zip函数,将两个集合的元素合并起来,譬如 zip [1,2,3] [4,5]  = [(1,4),(2,5)], 和空集合合并还是空的. -module(zip). -export([zip/2]). zip(_, []) -> []; zip([], _) -> []; zip([X|XS],[Y|YS]) -> [{X, Y}|zip(XS, YS)]. ------------------结果测试-----------------------------

erlang lists模块函数使用大全

http://qqdenghaigui.iteye.com/blog/1554541 一,带函数Pred1, all(Pred, List) -> boolean()如果List中的每个元素作为Pred函数的参数执行,结果都返回true,那么all函数返回true,否则返回false 例子: lists:all(fun(E) -> true end,[1,2,3,4]). 结果 true 2, any(Pred, List) -> boolean()如果List中至少有一个元素作为Pre

erlang lists模块函数使用大全(copy)

一,带函数Pred 1, all(Pred, List) -> boolean()如果List中的每个元素作为Pred函数的参数执行,结果都返回true,那么all函数返回true, 否则返回false例子:lists:all(fun(E) -> true end,[1,2,3,4]).结果true 2, any(Pred, List) -> boolean()如果List中至少有一个元素作为Pred函数的参数执行,结果返回true,那么any函数返回true, 否则返回false例子l

erlang判断模块导出函数问题

erlang本身提供一个接口,可以用来检查模块是否有导出函数,这个接口是erlang:function_exported/3,但是很多时候这个接口无法正常使用. 下面重现一下这个问题: 1> erlang:function_exported(crypto,start,0). false 2> crypto:start(). ok 3> erlang:function_exported(crypto,start,0). true 注意:例子中并不是说一定要crypto:start()才能使

ERLANG远端节点奔溃导致发消息进程堵消息问题探源

问题描述:在生产环境中出现一例性能问题,A和B两个结点运行在两台服务器上,A与B互联,A不断向B发送消息.B结点所在机器发生宕机,导致A结点中发送消息的进程赌消息. 追踪过程:通过erlang:process_info(erlang:whereis(Pid))发现current_function一直是gen:do_call/4.messages消息堆积到数十万级别. 源码分析:在代码中向远端发送消息的调用函数为erlang:send(Pid,Msg),Pid是属于远端结点的接收进程.对该函数做一

erlang中启动一个gen_server和一个纯粹进程的区别

1.在genserver的启动过程中,内部调用的是proc_lib:start_link(M,F,A,Time,SpawnOpts),当该函数被调用的时候,启动gen_server的进程必须wait,直到gen_server进程在执行init_it函数时,调用proc_lib:init_ack将gen_server的进程号返回给启动进程,至此一个gen_server进程才启动完成: 2.对于一个单纯的erlang进程来说,调用spawn函数来启动他,会立刻返回.

【转】Erlang基本数据类型

在讲述数据类型前先简单的介绍一下Erlang中的变量,Erlang中的变量和其他语言中的变量相比有三点不同: 1.Erlang不对变量的类型进行定义,它可以被赋值成任何类型的值,Erlang中所有类型的值统称为一个Term.这使得编译器并不能在编译时发现数值类型的不匹配,只有在运行时发现错误,好处是不像C++一样能通过强制类型转换蒙蔽系统,造成内存泄露,也使得Erlang不像C++一样易于发现代码中的问题.不过Erlang现在已经有一套类型,函数的定义机制,能通过dialyzer来查找代码中的不

Erlang语言研究综述

摘 要: 本文前半部分主要是关于Erlang编程语言相关的内容:着重就一般学习编程语言的一般的关注点来阐述了Erlang编程语言的基本语法点,主要包括:Erlang的变量.Erlang的数据类型.Erlang的语句和Erlang编程语言的函数与模块四个方面:本文的后半部分主要就Erlang语言的并行化编程的实践:Erlang的并行化编程与Erlang并行化编程在矩阵乘积的实际应用,通过实践,可以发现,Erlang语言确实在并行化编程方面表现得很优秀. 关键词:并行计算:Erlang:编程语言:矩