There are many possible answers and solutions to address your concerns. And I am new to AnyEvent myself. So could you explain in the example above how the callback could fire twice?
Notice too that in the example, all of the condvar handling is confined to the parent process. The callback only gets called when the child finishes and returns. All of the application logic exist in child processes and has no knowledge of condvars. This alows you to run code from say CPAN, that was written with no intention of being executed this way. And to my untrained eye, no danger of a callback double fire.