Skip to content

Instantly share code, notes, and snippets.

@arjan
Created December 14, 2012 09:09
Show Gist options
  • Save arjan/4283899 to your computer and use it in GitHub Desktop.
Save arjan/4283899 to your computer and use it in GitHub Desktop.
Erlang shell script to do some work in parallel on a number of input files. Parallelism is limited by the NumWorkers variable.
#!/usr/bin/escript
%% -*- mode: erlang -*-
main(Files) ->
NumWorkers = 3,
Parent = self(),
Workers = [spawn_link(fun() -> worker(Parent) end) || _ <- lists:seq(1, NumWorkers)],
serve_queue(Files),
%% We need to wait for the workers to finish; with escript, the VM exits when the main process stops
[Worker ! stop || Worker <- Workers],
wait_stop(Workers).
serve_queue([]) ->
ok;
serve_queue([File|Rest]) ->
receive
{want_file, Pid} ->
Pid ! {work, File},
serve_queue(Rest)
end.
wait_stop([]) ->
ok;
wait_stop([_|R]) ->
receive
ok ->
wait_stop(R)
end.
worker(Parent) ->
Parent ! {want_file, self()},
receive
{work, File} ->
resize(File),
worker(Parent);
stop ->
Parent ! ok
end.
resize(F) ->
io:format("Resizing: ~p~n", [F]),
%% os:cmd("mogrify -resize 300x300 " ++ F),
ok.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment