在 Gearman 中,任务的管理和执行是基于分布式工作队列的原理。这个系统允许将任务分发到多个 worker 进程,以实现负载均衡和并发处理。在本文中,我们将深入探讨 Gearman 任务的两个关键特性:优先级和返回状态。
一、任务的优先级
在 Gearman 中,任务的优先级分为三个级别:低(Low)、正常(Normal)和高(High)。这允许用户根据任务的重要性和紧急程度来设置不同的处理顺序。以下是如何在 Gearman 客户端中设置任务优先级的示例:
1. 同步阻塞调用:
- `doLow`:用于指定最低优先级的任务。
- `doNormal`:这是默认优先级,适用于大多数普通任务。
- `doHigh`:用于标记为最优先执行的任务。
2. 异步非阻塞调用:
- `doLowBackground`、`doBackground` 和 `doHighBackground` 这些方法会立即返回任务句柄,而不是等待结果。这些句柄可用于后续查询任务的状态。
以下是一个简单的客户端(cli.php)示例,展示了如何添加不同优先级的任务:
```php
$client = new GearmanClient();
$client->addServer('127.0.0.1', 4730);
// 添加不同优先级的任务
$client->addTaskLow('sum', json_encode(array(100, 100)));
$client->addTask('sum', json_encode(array(200, 200)));
$client->addTaskHigh('sum', json_encode(array(300, 300)));
$client->runTasks();
```
在 worker 端(worker.php),我们需要定义处理函数来执行这些任务。在本例中,`sum` 函数接收两个数字,相加并返回结果。为了模拟延迟,这里使用了 `sleep(1)`。
二、获取任务的状态
Gearman 提供了多种回调函数,以便客户端能够实时跟踪任务的状态。以下是一些关键回调:
1. `setCreatedCallback`:当任务被创建并加入队列时触发。
2. `setDataCallback`:当接收到任务数据时触发。
3. `setStatusCallback`:在任务执行过程中,用于获取任务的完成进度。
4. `setCompleteCallback`:任务成功完成后触发。
5. `setFailCallback`:任务执行失败时触发。
以下是一个示例客户端代码,展示了如何设置这些回调:
```php
$client = new GearmanClient();
$client->addServer('127.0.0.1', 4730);
// 设置各种状态回调
// ...
$client->addTaskLow('reverse', '1234567');
$client->addTask('reverse', 'hello');
$client->addTaskHigh('reverse', 'world');
$client->runTasks();
```
在这些回调函数中,你可以使用 `taskNumerator()` 和 `taskDenominator()` 方法来获取任务的完成进度。例如,在 `reverse_status` 回调中,你可以查看任务完成了多少部分,还有多少部分未完成。
通过理解 Gearman 的任务优先级和状态管理,开发者可以更好地控制任务的执行流程,优化系统的响应速度和效率。在实际应用中,这有助于确保关键任务优先得到处理,同时也能实时监控任务的执行情况,及时发现和处理问题。