concurrency - Erlang 中的 PID 列表

标签 concurrency erlang list process

长话短说,我正在尝试在 Erlang 中复制 Sleeping barber 问题。

在我的解决方案中,我决定将所有正在等待的进程放入一个列表中。然后,一旦进程轮流,我就会将该 PID 从列表中删除。

不幸的是,当我打电话时

length(myListOfPids).

它失败了,例如:
length([<0.46.0>]).
* 2: syntax error before: '<'

有没有办法存储 PID 以便我可以调用它们并正常使用它们? IE。
PID ! message

...以防万一,这是我在运行程序时收到的实际错误:
=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}]}

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

最佳答案

您还可以使用 pid/3 从它的三个组件构造一个 Pid。

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

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

您的程序遇到的问题不同。

{badarg,[{erlang,length,[<0.46.0>]},{barber1,waitingRoom,2}]}

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

1> 二郎:长度(pid(0,46,0))。

您打算在哪里:

1> 二郎:长度([pid(0,46,0)])。

(令人讨厌的是,erlang shell 现在对您隐藏了 erlang 的内部错误表示。将上述错误替换为:

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

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

关于concurrency - Erlang 中的 PID 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3156843/

相关文章:

java - 如何将 2D arraylist 传递给接受 2D List 的函数

swift - 正确取消 View ​​模型中的任务

java 并发实践 5.19

erlang - 在另一个进程上设置 seq_trace

performance - Couchdb 1.5 和 Node JS 查询服务器

unicode - Erlang 和带有 Cyrillic 的二进制文件

c++ - 从多线程使用 QuantLib 的正确方法是什么?

Java : Concurrent Modification exception when replacing pattern in ArrayList

python - 用 Python 编写向量(数学)类

python - 将整数添加到列表中所有非整数元素