2010-07-01 22 views
5

Resumen breve Estoy tratando de reproducir el problema del peluquero dormido en Erlang.Lista de PID en Erlang

En mi solución, decidí que para todos los procesos que estaban esperando los pondría en una lista. Entonces, una vez que sucedió el proceso, quitaría ese PID de la lista.

Desafortunadamente cuando llamo

length(myListOfPids). 

falla, como un ejemplo:

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

hay una manera de almacenar PID de modo que pueda recuperarlos y utilizarlos normalmente? es decir

PID ! message 

... en caso de que importa aquí es el error real que recibo cuando se ejecuta mi programa:

=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 es mi módulo, sala de espera es la función que realiza un seguimiento de qué procesos están esperando

Respuesta

6

Introducir Pids escribiéndolos tampoco funciona para mí. ¿Es ese el único problema?

Con código:

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

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

me sale:

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 
3

El problema es que mientras <0.46.0> es la forma en que un PID se imprimen , no puede ser entraron en este camino. Puede usar list_to_pid("<0.46.0>") en su lugar. Por supuesto, una vez que tiene un PID (creado de esta manera, devuelto desde spawn, etc.), puede almacenarse en una lista y recuperarse como cualquier otro término de Erlang.

10

También puede construir un Pid desde sus tres componentes utilizando pid/3.

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

Tenga en cuenta que el uso de cualquiera de estas técnicas para construir Pid no es correcto si construye un pid en un nodo diferente al que se creó.

El problema que tiene su programa es diferente.

{badarg, [{erlang, longitud, [< 0.46.0>]}, {barber1, waitingroom, 2}]}

Una llamada a erlang: longitud/1 creó un badarg. El tercer elemento de {erlang, length, [< 0.46.0>]} es la lista de argumentos pasados ​​a erlang: length. Entonces eso es equivalente a:

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

donde se destinen:

1> Erlang: longitud ([pid (0,46,0)]).

(Molesto, el shell de Erlang ahora esconde la representación interna de Erlang de errores de Sustitución de que el error anterior con:.

** error de excepción: mal argumento en función longitud/1 denominado como la longitud (< 0.35.0 >)

que es mucho más fácil de entender, pero menos útil, ya que se interpone en el camino del aprendizaje de la habilidad esencial de la interpretación de errores Erlang sí mismo.)

2

la manera estándar para obtener un PID es tomar el valor de retorno de una función de generación, ya sea spawn/1, spawn/3, spawn_link/1, spawn_link/3, y proc_lib equivalentes.

Una manera simple de escribir un pid es con la función c: pid/3, llamada como c:pid(0,25,0), que devolverá <0.25.0>. Esa es una función de acceso directo para el shell. De lo contrario, puede usar list_to_pid/1 como lo menciona Alexey Romanov.

Sin embargo, debe tener en cuenta el papel de los pids antes de tratar de compilarlos a mano. El pid actúa como el identificador personal de un proceso y está destinado a ser utilizado solo por aquellos que lo conocen. Si no tienes el pid en tu mano, entonces probablemente ya no deberías estar en su poder. Indirectamente, esto tiene como objetivo aislar las diferentes partes de un programa. — solo se preocupan por los bits generados y hacen que cada parte de su programa sea un negocio propio.

La manera más limpia de hacerlo es usar el valor de retorno de una función de generación. Generar un pid a mano debe dejarse solo como una solución de depuración.

5

Este mensaje de error:

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

significa que usted llamaba length(<0.46.0>), no length([<0.46.0>]) (ignorando por el momento que los PID sólo se puede escribir, no leer). En el seguimiento de la pila, la función más alta tendrá la lista de argumentos. Dado que length toma un argumento, esta lista tiene un único argumento: está tomando la longitud de un PID, lo que obviamente falla, ya que solo las listas tienen longitudes.