Спаун

Спаун — акт порождения нового актора. То же: spawn, spawning.

Актор спаунится с помощью бифа spawn и производных от него: spawn_link, spawn_monitor, spawn_opt и spawn_request. Все эти функции являются частью модуля erlang.

Арность у spawn может быть от одного до четырёх. Первые две функции используются для спауна фунтермов: spawn(Fun) просто спаунит фунтерм на текущей ноде, spawn(Node, Fun) спаунит фунтерм на произвольной ноде. Другие две функции используются для спауна функций: spawn(Module, Function, Args) спаунит МФА на текущей ноде, а spawn(Node, Module, Function, Args) — на произвольной.

Если нам нужна горячая замена кода в создаваемом акторе, следует указывать МФА, а значит, мы не сможем спаунить фунтерм.

Фактически, мы спауним не фунтерм или функцию, а задание. Мы как бы сообщаем виртуальной машине, что у нас есть задание: на такой-то ноде заспаунить отдельным процессом такую-то функцию из такого-то модуля с такими-то аргументами. И далее это задание выполняется.

Спаун заканчивается тем, что мы получаем пид созданного актора.

1> Pid = spawn(io,format,["Привет!~n"]).
Привет!
<0.86.0>
2> Pid.
<0.86.0>

В данном примере задание очень скоротечное, актор быстро создаётся и быстро завершается. В других случаях актор может жить секунды, дни, годы. Но сам акт спауна очень короткий, и пид мы получаем почти моментально.

7> timer:tc(erlang, spawn, [timer,sleep,[10_000]]).
{18,<0.98.0>}
8> timer:tc(erlang, spawn, [timer,sleep,[10_000]]).
{25,<0.100.0>}
9> timer:tc(erlang, spawn, [timer,sleep,[10_000]]).
{10,<0.102.0>}

В данном примере мы с помощью функции timer:tc/3 измеряем время спауна задания, состоящего в том, чтобы заснуть на 10 секунд. Хотя время жизни актора составляет 10 секунд, акт его спауна продолжался всего 10-25 микросекунд. (sleep принимает миллисекунды, а tc возвращает микросекунды.)


Copyright © 2025 Алексей Карманов