I think synchronous workers can be used for jobs that use some global state and should only run one at time. So if you manage to run only one worker, it guarantees that you run only one job at time. Forking is a good way to preset the environment and avoid the namespace pollution introduced by running possibly unsafe code.

Asynchronous forked workers can run jobs concurrently with a ready environment.