Спаун — акт порождения нового актора. То же: 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 Алексей Карманов