2010-11-18 6 views
2

Ich implementiere einen Chat-Server in Erlang. Gemäß meinem Entwurf hat jeder Client einen entsprechenden Agentenprozess auf dem Serverknoten, der die Nachrichten verarbeitet. Ich schreibe die PIDs der Agenten in die Datenbank, so dass ich Nachrichten zwischen ihnen austauschen kann.Killing-Prozesse in Erlang durch PIDs

Ist es sicher, wenn ich die PIDs töte? Zum Beispiel, nachdem mein Server neu gestartet wurde, befinden sich die PIDs immer noch in der Datenbank (aber die Prozesse werden abstürzen), wird es Chancen geben, dass die PIDs in der Datenbank mit anderen (neu erzeugten) wichtigen Prozessen kollidieren?

Wenn ja, kann ich nicht einfach den Agenten töten, wenn der Client nicht reagiert. Bisher habe ich es nicht beobachtet, aber es wäre schön, das sicher zu wissen.

Antwort

7

PIDs werden in Spawn-Reihenfolge von 0.0.0 (init) zugewiesen, wenn der Knoten gestartet wird. Sie können also leicht PID-Kollisionen erhalten, wenn Sie sie zwischen Knoten-Neustarts speichern.

Sie haben eine Art von Registrierung erstellt, mit der Sie die PID für einen bestimmten Client nachschlagen können - diese Registrierung muss tote PIDs rechtzeitig entfernen. Ein typisches Design besteht darin, dass die Registrierung jeden registrierten Prozess überwacht (erlang:monitor/2) und den Registrierungseintrag entfernt, wenn der Prozess abbricht und die Nachricht {'DOWN', Ref, process, Pid, Info} empfangen wird.

Ich würde auch hinzufügen, dass das Speichern einer PID außerhalb Erlang (wenn Ihre Datenbank nicht ETS oder Mnesia ist) ist aus diesem Grund ungewöhnlich - die PID wird nichts bedeuten, nachdem der Prozess oder Knoten stirbt.

0

PIDs können bei Neustarts wiederverwendet werden. Es ist sehr wahrscheinlich, dass sie mit anderen PIDs kollidieren, weil sie sequentiell sind. Sie sollten sicherstellen, dass eine PID aus Ihrer Datenbank gelöscht wird, die einem ausgefallenen Knoten entspricht.

1> spawn(fun() -> ok end). 
<0.35.0> 
2> spawn(fun() -> ok end). 
<0.37.0> 
3> spawn(fun() -> ok end). 
<0.39.0> 
+0

Sollte es nicht sein "Pids kann nicht .." im ersten Satz dann? – ZeissS

+0

Nein, ich meinte was ich gesagt habe. PIDs können über Neustarts [von der VM] wiederverwendet werden. –