The choice of a particular model depends on the specific task. For example,
a web server can create descendant processes to handle requests (if the
descendant set is not enough to handle that request). In this case, the
processing must be asynchronous, as soon as the descendant is created and
the ancestor must be ready to receive the next request. Compiler C, on the
other hand, must wait for the completion of each step before proceeding to
the next stage, in which case they use synchronous processing.