Question: The code:

```
$gmc = new GearmanClient();
$gmc->addServer();
$gmc->setCompleteCallback(function(GearmanTask $task){
    echo 'Complete: Task ' . $task->unique() . PHP_EOL;
});

for ($i=0; $i<10; $i++) {
    $gmc->addTask('queryShard', json_encode($taskData), null, 'Job:' . $i);
}

if (!$gmc->runTasks()) {
    echo "ERROR " . $gmc->error() . "\n";
}

```

I can see when each of the fired tasks are done. However, is there a way to fire an event when all launched tasks succeed (please don't offer solutions that rely on manual task registry)?

Also, can anyone advise on how to manage a group of tasks as a single set?

Thanks!

Answer: 
*runTasks* will block execution of the calling thread until all added foreground tasks complete. See fiskfisk [answer](https://stackoverflow.com/questions/10397923/parallelization-with-gearman) for more details. However the fact that the all tasks completed does not imply that all tasks successfully completed. 

Gearman application framework intentionally does not make assumptions on (un)successful competition of the tasks. There are many Gearman client implementations and limitless number of use cases. It is on the developer to provide the most suitable solution for the use case in question.

Most commonly I would use the [SplObjectStorage](http://php.net/manual/en/class.splobjectstorage.php) class along with implementing created, fail, warning, exception and complete callbacks to track tasks completion on the client side. There might be complex use cases when additional tracking on the workers side might be needed.
You can use the following:

```
$taskset = $gmc->new_task_set();
while(...) {
    $taskset->addTask(...);
}
$taskset->wait();

```

to wait until all jobs has been finished.