Can';Erlang中的t spawn进程

Can';Erlang中的t spawn进程,erlang,Erlang,我不太清楚为什么我不能得到这个答案,但我相信答案非常简单。我只是测试了一些东西,在测试中发现我希望在gen\u服务器的handle\u info中生成一个进程 然而,尽管我尝试了不同的组合,我从我的孩子那里得到的最好结果是死于一个错误并返回{unde,[{bob,hello,[],[]} 代码: 我的第一个目标是确定是否可以用一个模块启动多个服务器。第二个是如果handle\u info是在一个单独的进程中执行的。。。由于某种原因,当我读到它是异步的时,我认为它在另一个进程中。现在第三个是在该调

我不太清楚为什么我不能得到这个答案,但我相信答案非常简单。我只是测试了一些东西,在测试中发现我希望在
gen\u服务器的
handle\u info
中生成一个进程

然而,尽管我尝试了不同的组合,我从我的孩子那里得到的最好结果是死于一个错误并返回
{unde,[{bob,hello,[],[]}

代码:

我的第一个目标是确定是否可以用一个模块启动多个服务器。第二个是如果
handle\u info
是在一个单独的进程中执行的。。。由于某种原因,当我读到它是异步的时,我认为它在另一个进程中。现在第三个是在该调用中生成一个进程

我典型的shell是这样的(带注释):

我使用了
hello/1
[]
以及
hello/0
。以及
spawn/1
spawn/3
spawn\u link/1
spawn\u link/3
。。。我使用了
?模块
测试
状态
和咯咯笑
{local,State}
作为模块参数。我已经放弃了在多个网站上看到的内容,在传递函数时加入了
fun hello/0
fun hello/1
。这会产生崩溃,但消除了编译器警告

哪里出错了?

的第三个参数是一个列表,其中包含派生函数所需的参数数。例如,如果派生函数接受1个参数,则列表将包含1个参数;如果派生的函数接受3个参数,那么列表将包含3个参数。最后,如果派生函数接受0个参数,则列表将包含0个参数,即空列表

您这样定义了
hello

hello([]) ->
    io:format("WOOT ~p~n",[self()]).
这是一个arity为1的函数,不仅如此,与该函数匹配的唯一参数是空列表。为了将一个参数传递给生成的函数,必须编写:

spawn(?MODULE, hello ,[SomeArg])
而且,由于要匹配将空列表作为其唯一参数的函数,SomeArg必须是空列表:

spawn(?MODULE, hello, [[]])
请注意,
spawn/3
的语法是MFA,或者模块名、函数名、参数,这是包含参数的列表

接下来,您还有两个问题:

  • 您不应该像在这里那样调用
    gen\u server:start\u link(bob)

    {ok, P} = gen_server:start_link(bob)
    
    没有像
    gen\u server:start\u link/1
    这样的功能。相反,您需要调用用户界面函数
    start\u link/1
    ,然后调用
    gen\u server:start\u link/3
    。您可能需要重命名您的用户界面函数
    my\u gen\u server\u starter()
    ,以便清楚它的作用

  • %%警告我在任何化身中都没有使用hello函数

    您必须导出一个函数才能生成它。因为您没有导出函数,而且模块内没有函数调用函数,这意味着函数永远无法执行


  • 在我尝试的组合中,我一定是因为大脑记忆错误而输入了#1。我也在某个时刻将参数与我的
    spawn
    调用正确匹配。这是我在多页上看到的一个细节。解决办法是#2。我只是复制/粘贴并删除IDE中的所有绒毛。。。我通常使用
    export\u all
    。。。。我不知道要花多长时间才能确定解决方案。
    spawn(?MODULE, hello, [[]])
    
    {ok, P} = gen_server:start_link(bob)