Another approach is to write a wrapper script (in Perl) to run each job. That wrapper script attempts to claim a semaphore that has a maximum count of 3. The attempt will block if there are 3 (or more) jobs running. After claiming the semaphore the job is run, then (important) it releases the semaphore, which should allow a waiting job to run.
.