Concurrency PID和x27的列表;她在二郎
长话短说,我试图复制二郎的睡眠理发师问题 在我的解决方案中,我决定对于所有等待的进程,我会将它们放入一个列表中。然后,一旦进程启动,我就会从列表中删除PID 不幸的是当我打电话时Concurrency PID和x27的列表;她在二郎,concurrency,erlang,list,process,Concurrency,Erlang,List,Process,长话短说,我试图复制二郎的睡眠理发师问题 在我的解决方案中,我决定对于所有等待的进程,我会将它们放入一个列表中。然后,一旦进程启动,我就会从列表中删除PID 不幸的是当我打电话时 length(myListOfPids). 它失败了,例如: length([<0.46.0>]). * 2: syntax error before: '<' 。。。为了以防万一,我在运行程序时收到的实际错误是: =ERROR REPORT==== 1-Jul-2010::05:50:40 ==
length(myListOfPids).
它失败了,例如:
length([<0.46.0>]).
* 2: syntax error before: '<'
。。。为了以防万一,我在运行程序时收到的实际错误是:
=ERROR REPORT==== 1-Jul-2010::05:50:40 ===
Error in process <0.44.0> with exit value:
{badarg,[{erlang,length,[<0.46.0>]},{barber1,waitingRoom,2}]}
=错误报告===2010年7月1日::05:50:40===
使用退出值处理时出错:
{badarg,[{erlang,length,[]},{barber1,waitingRoom,2}]}
barber1是我的模块,waitingRoom是跟踪哪些进程正在等待的功能通过键入PID输入PID对我也不起作用。 这是唯一的问题吗 代码为:
-module(test).
-export([loop/0]).
loop() ->
receive
{hello} ->
io:format("Hello world!~n"),
loop()
end.
我得到:
Eshell V5.7.5 (abort with ^G)
1> Pid = spawn(fun test:loop/0).
<0.35.0>
2> L = [Pid].
[<0.35.0>]
3> length(L).
1
Eshell V5.7.5(使用^G中止)
1> Pid=spawn(有趣的测试:循环/0)。
2> L=[Pid]。
[]
3> 长度(L)。
1.
问题在于,虽然打印PID的方式是
,但不能以这种方式输入。您可以改为使用list\u to\u pid(“”
)。当然,一旦有了PID(以这种方式创建,从spawn
等返回),就可以将其存储在列表中,并像任何其他Erlang术语一样进行检索。还可以使用PID/3从其三个组件构建PID
1> 长度([pid(0,35,0)])
请注意,如果在与创建Pid的节点不同的节点上构造Pid,则使用这些技术中的任何一种来构造Pid都会出错
您的程序遇到的问题不同
{badarg,[{erlang,length,[]},{barber1,waitingRoom,2}]}
对erlang:length/1的调用创建了一个badarg。{erlang,length,[]}的第三个元素是传递给erlang:length的参数列表。这相当于:
1> erlang:length(pid(0,46,0))
如果您打算:
1> erlang:length([pid(0,46,0)])
(令人烦恼的是,erlang shell现在对您隐藏了erlang的内部错误表示形式。将上述错误替换为:
**异常错误:函数length/1中的参数错误,称为length()
获取pid的标准方法是获取spawn函数的返回值,可以是
spawn/1
,spawn/3
,spawn\u-link/1
,spawn\u-link/3
,spawn\u-link/1
,spawn\u-link/3
,以及proc_lib
等同物
写pid的一种简单方法是使用函数c:pid/3,称为likec:pid(0,25,0)
,它将返回
。这是shell的快捷功能。否则,您可以使用Alexey Romanov提到的list_to_pid/1
但是,在尝试手动构建PID之前,您应该了解PID的作用。pid作为流程的个人标识符,仅用于了解流程的人员。如果您手中没有pid,那么您可能不应该已经拥有它。间接地说,这意味着隔离程序的不同部分——只关心您产生的那些位,让程序的每个部分都有自己的业务
因此,最干净的方法是使用spawn函数的返回值。手动生成pid只能作为调试解决方案。此错误消息:
=ERROR REPORT==== 1-Jul-2010::05:50:40 ===
Error in process <0.44.0> with exit value:
{badarg,[{erlang,length,[<0.46.0>]},{barber1,waitingRoom,2}]}
=错误报告===2010年7月1日::05:50:40===
使用退出值处理时出错:
{badarg,[{erlang,length,[]},{barber1,waitingRoom,2}]}
表示调用的是length()
,而不是length([])
(暂时忽略PIDs只能写不能读)。在堆栈跟踪中,最顶层的函数将具有参数列表。由于length
只接受一个参数,因此此列表只有一个参数:您使用的是PID的长度,这显然是失败的,因为只有列表具有长度
=ERROR REPORT==== 1-Jul-2010::05:50:40 ===
Error in process <0.44.0> with exit value:
{badarg,[{erlang,length,[<0.46.0>]},{barber1,waitingRoom,2}]}