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)