Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List of PID's in Erlang

Long story short I am trying to replicate the Sleeping barber problem in Erlang.

In my solution I decided that for all the processes that are waiting I would put them into a list. Then, once it was that processes turn, I would take that PID off of the list.

Unfortunately when I call

length(myListOfPids).

it fails, as an example:

length([<0.46.0>]).
* 2: syntax error before: '<'

is there a way to store PID's so that I can recall them and use them normally? i.e.

PID ! message

... just in case it matters here is the actual error I recieve when running my program:

=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 is my module, waitingRoom is the function that keeps track of which processes are waiting

like image 376
Toymakerii Avatar asked Jul 01 '10 10:07

Toymakerii


People also ask

What is a PID in Erlang?

Each process in erlang has a process identifier ( Pid ) in this format <x.x.x> , x being a natural number. Below is an example of a Pid <0.1252.0> Pid can be used to send messages to the process using 'bang' ( ! ), also Pid can be bounded to a variable, both are shown below. MyProcessId = self().

How do I terminate a process in Erlang?

A process can terminate itself by calling one of the BIFs exit(Reason), erlang:error(Reason), erlang:error(Reason, Args), erlang:fault(Reason) or erlang:fault(Reason, Args). The process then terminates with reason Reason for exit/1 or {Reason,Stack} for the others.

What is spawn in Erlang?

spawn() creates a new process and returns the pid. The new process starts executing in Module:Name(Arg1,...,ArgN) where the arguments are the elements of the (possible empty) Args argument list.

Is Erlang multithreaded?

Nginx and Erlang most certainly use multiple threads by default. They both use thread pools.


1 Answers

You can also construct a Pid from it's three components using pid/3.

1> length([pid(0,35,0)]).

Be aware that using any of these techniques for constructing Pid goes wrong if you construct a pid on a different node than the one it was created on.

The problem your program is having is different.

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

A call to erlang:length/1 created a badarg. The third element of {erlang,length,[<0.46.0>]} is the list of arguments passed to erlang:length. So that's equivalent to:

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

where you intended:

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

(Annoyingly, the erlang shell now hides erlang's internal representation of errors from you. Replacing the above error with:

** exception error: bad argument in function length/1 called as length(<0.35.0>)

which is much easier to understand but less useful because it gets in the way of learning the essential skill of interpreting erlang errors yourself.)

like image 153
cthulahoops Avatar answered Sep 30 '22 18:09

cthulahoops