Goroutines in Erlang
On this page
A lightweight thread of execution in Erlang is known as a process. Here’s how you can accomplish similar functionality to goroutines using Erlang.
Explanation and Code Example
A lightweight thread of execution
An Erlang process is a lightweight thread of execution.
-module(goroutines).
-export([start/0, f/1]).
f(From) ->
loop(From, 0).
loop(From, 3) ->
ok;
loop(From, N) ->
io:format("~s : ~p~n", [From, N]),
loop(From, N + 1).
start() ->
% Synchronously call the function
f("direct"),
% Start a new process to call the function concurrently
spawn(fun() -> f("process") end),
% Start a new process to call an anonymous function concurrently
spawn(fun() -> io:format("going~n") end),
% Sleep to ensure the started processes have time to complete
timer:sleep(1000),
io:format("done~n").Detailed Explanation
Function Definition: We define an Erlang module
goroutinesand export two functionsstart/0andf/1.Loop Function: The function
f/1calls a helper functionloop/2, iterating 3 times and printing a message each time.Start Function: The
start/0function demonstrates synchronous call and the concurrent process creation:- Call
f("direct")synchronously. - Use
spawn/1to create a new process to callf("process"), enabling concurrent execution. - Use
spawn/1to start another process with an anonymous function, printing “going”. - Use
timer:sleep(1000)to wait for the processes to finish.
- Call
Running the Program
To run the program and see the output:
$ erl -noshell -s goroutines start -s init stopExpect to see output similar to:
direct : 0
direct : 1
direct : 2
process : 0
going
process : 1
process : 2
doneIn this example, the spawn/1 function is used to create new concurrent processes, which is how we achieve the concurrency seen with goroutines.