Erlang中的PID列表

Toy*_*rii 5 concurrency erlang list process

长话短说我试图复制Erlang中的睡眠理发问题.

在我的解决方案中,我决定对于所有等待的进程,我会将它们放入列表中.然后,一旦进程转向,我就会从列表中取出PID.

不幸的是,当我打电话

length(myListOfPids).
Run Code Online (Sandbox Code Playgroud)

它失败了,作为一个例子:

length([<0.46.0>]).
* 2: syntax error before: '<'
Run Code Online (Sandbox Code Playgroud)

有没有办法存储PID,以便我可以回忆起并正常使用它们?即

PID ! message
Run Code Online (Sandbox Code Playgroud)

...以防这里重要的是我在运行程序时收到的实际错误:

=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}]}
Run Code Online (Sandbox Code Playgroud)

barber1是我的模块,waitingRoom是跟踪哪些进程正在等待的函数

cth*_*ops 10

你也可以使用pid/3从它的三个组件构造一个Pid.

1>长度([pid(0,35,0)]).

请注意,如果您在与创建Pid的节点不同的节点上构建pid,则使用这些技术中的任何一种来构造Pid都会出错.

你的程序遇到的问题是不同的.

{badarg,[{二郎,长度,[<0.46.0>]},{barber1,候车室,2}]}

对erlang的调用:length/1创建了一个badarg.{erlang,length,[<0.46.0>]}的第三个元素是传递给erlang的参数列表:length.这相当于:

1> erlang:length(pid(0,46,0)).

你打算在哪里:

1> erlang:length([pid(0,46,0)]).

(令人讨厌的是,erlang shell现在隐藏了erlang对你的错误的内部表示.用以下代码替换上面的错误:

**异常错误:函数长度/ 1中的错误参数称为长度(<0.35.0>)

这更容易理解但不太有用,因为它妨碍了自己学习解释erlang错误的基本技能.)


Koi*_*nen 6

输入Pids键入它们对我来说也不起作用.这是唯一的问题吗?

使用代码:

-module(test).
-export([loop/0]).

loop() ->
    receive
        {hello} ->
            io:format("Hello world!~n"),
            loop()
end.
Run Code Online (Sandbox Code Playgroud)

我明白了:

 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
Run Code Online (Sandbox Code Playgroud)


leg*_*cia 5

此错误消息:

=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}]}
Run Code Online (Sandbox Code Playgroud)

意味着你正在调用length(<0.46.0>),而不是 length([<0.46.0>])(忽略PID只能被写入,而不是被读取).在堆栈跟踪中,最顶层的函数将具有参数列表.由于length接受一个参数,此列表只有一个参数:您正在获取PID的长度,这显然会失败,因为只有列表具有长度.