2017-02-08 2 views
2

Ich bin neu in Erlang und ich würde gerne den Unterschied zwischen zwei Code-Schnipsel wissen.Exit Anruf innerhalb der Spawn in Erlang

spawn_link(exit(fun()-> myfun() end)) 

und

spawn_link(fun()->exit(myfun()) end) 

ich Verhalten gleiche würde denken, aber es ist nicht.

Antwort

5

spawn_link ist eine Funktion, und die Aufrufe verhalten sich wie normale Funktionsaufrufe: zuerst werden die Argumente ausgewertet, und dann wird die Funktion mit den ausgewerteten Argumenten aufgerufen.

So in dem ersten Beispiel, das Argument zu spawn_link ist:

exit(fun()-> myfun() end) 

exit, wenn sie mit einem Argument aufgerufen, den aktuellen Prozess-Exit macht, das Argument als Austrittsgrund verwenden. In diesem Fall stürzt der Prozess ab, bevor er die Möglichkeit hat, spawn_link aufzurufen, und erstellt nie einen neuen Prozess. (.. Der Ausgang Grund des aktuellen Prozesses wird ein fun sein, was sehr ungewöhnlich ist, aber erlaubte die fun nicht genannt werden)

Im zweiten Beispiel, das Argument zu spawn_link ist:

fun()->exit(myfun()) end 

Das ist ein fun. Die Ausdrücke darin werden erst ausgewertet, wenn die Funktion aufgerufen wird. Daher übergeben wir diese Funktion an spawn_link, was einen neuen Prozess hervorruft, der diese Funktion ausführt. Der neu erzeugte Prozess ruft myfun auf und wird dann mit dem Rückgabewert myfun als Ausgangsgrund beendet.