The threadPool package

Takes an optional argument which is the number
of threads (the default is three). Give it the commands to run, one
per line, through standard input.
You may use blank lines to divide the commands into sections. The
commands in a section will not be started until all the commands in
previous sections are complete. Each section can be given its own
thread count.