Переменные связываются один раз в Erlang
Изменить: я изменил название этого вопроса, так как он был бесполезен в свете ошибки n00b, которую я сделал. Остаток остается неизменным и служит предостережением!
Я использую Erlang OTP версии 17.4. Рассмотрим следующий сеанс оболочки Erlang, где я экспериментирую с trap_exit
флаг процесса, как объяснено в разделе "Изучаем некоторые ошибки: ошибки и процессы".
Во-первых, я установил trap_exit
флаг для преобразования сигналов выхода в связанных процессах в обычные сообщения:
Eshell V6.2 (abort with ^G)
1> process_flag(trap_exit, true).
false
Затем я порождаю связанный процесс и немедленно завершаю его вызовом exit/2
:
2> exit(spawn_link(fun() -> timer:sleep(50000) end), kill).
true
Затем я прочитал преобразованное сообщение о выходе:
3> receive X -> X end.
{'EXIT',<0.61.0>,killed}
Пока все выглядит хорошо, как описано в книге. Теперь просто ради удовольствия spawn_link
и завершить другой процесс:
4> exit(spawn_link(fun() -> timer:sleep(5000) end), kill).
true
И попробуйте прочитать преобразованное сообщение о выходе:
5> receive X -> X end.
В этот момент оболочка висит. Мой вопрос: почему поведение меняется во время второго обхода и куда делось сообщение о выходе?
1 ответ
Ваш второй receive X -> X end.
уже имеет X
связаны; он пытается получить сообщение, точно совпадающее с тем, которое вы уже видели. Поскольку pid будет другим, сообщение никогда не будет совпадать. Так что зависает, ожидая того, что совпадет.
Вам нужно f(X)
первый.