Better than queueing would be to fork subshell processes and using "wait" - spawn no more processes than your box can handle at a time (using a $MAXPROC), "wait" until it's done, then proceed. If you want to get fancy, implement some pipelining so you don't have to wait for all child procs to finish, but the basic concept is simple.
I wouldn't use a scheduler, that's just unnecessary.