Concurrency PID和x27的列表;她在二郎

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 ==

长话短说,我试图复制二郎的睡眠理发师问题

在我的解决方案中,我决定对于所有等待的进程,我会将它们放入一个列表中。然后,一旦进程启动,我就会从列表中删除PID

不幸的是当我打电话时

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,称为like
c: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}]}