gearman中任务的优先级和返回状态实例分析


Posted in PHP onFebruary 27, 2020

本文实例讲述了gearman中任务的优先级和返回状态。分享给大家供大家参考,具体如下:

gearman中任务的优先级和返回状态

一、任务的优先级

同步阻塞调用,等待返回结果

doLow:最低优先
doNomal:正常优先级
doHigh:最优先执行

异步派发任务,不等待返回结果,返回任务句柄,通过该句柄可获取任务运行状态信息

doLowBackground
doBackground
doHighBackground

注意Task和doXXX区别,Task是一组job,派发后会分配到多个worker上并行执行并返回结果给调用方。
而doXXX的每个任务只会在一个worker上执行。

addTaskLow
addTask
addTaskHigh

addTaskLowBackground 
addTaskBackground 
addTaskHighBackground

cli.php代码如下:

<?php
$client = new GearmanClient();
$client->addServer('127.0.0.1', 4730);
$client->setCompleteCallback(function($task) {
  echo $task->data(), PHP_EOL;
});
//分别添加不同优先级的Task
$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.php代码如下:

<?php
$worker = new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('sum', function($job) {
  $data = json_decode($job->workload(), true);
  $ret = $data[0] + $data[1];
  echo $ret, PHP_EOL;
  sleep(1);
  return $ret;
});
while($worker->work());

注意,为了实验效果,这里worker只需启动一个。

gearman中任务的优先级和返回状态实例分析

二、获取任务的状态

cli.php代码如下:

<?php
$client = new GearmanClient();
$client->addServer('127.0.0.1', 4730);
//任务排队时的回调
$client->setCreatedCallback('reverse_create');
//有任务数据包时的回调
$client->setDataCallback('reverse_data');
//收集任务状态的回调
$client->setStatusCallback('reverse_status');
//任务完成时的回调
$client->setCompleteCallback('reverse_complete');
//任务失败时的回调
$client->setFailCallback('reverse_fail');
//分别添加不同优先级的Task
$client->addTaskLow('reverse', '1234567');
$client->addTask('reverse', 'hello');
$client->addTaskHigh('reverse', 'world');

$client->runTasks();

function reverse_create($task) {
  echo '任务创建(', $task->jobHandle() , '): ', PHP_EOL;
}
function reverse_data($task) {
  echo '接收数据(', $task->jobHandle() , '): ', $task->data(), PHP_EOL;
}
function reverse_status($task) {
  //taskNumerator()获取任务完成情况的分子
  //taskDenominator()获取任务完成情况的分母
  echo '完成情况(', $task->jobHandle() , '): ', $task->taskNumerator(), '/', $task->taskDenominator(), PHP_EOL;
}
function reverse_complete($task) {
  echo '任务完成(', $task->jobHandle() , '): ', $task->data(), PHP_EOL;
}
function reverse_fail($task) {
  echo '任务失败(', $task->jobHandle() , '): ', PHP_EOL;
}

worker.php代码如下:

<?php
$worker = new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('reverse', function($job) {
  //workload()返回接收的数据
  $data = $job->workload();
  //workloadSize()返回接收数据的字节大小
  $dataSize = $job->workloadSize();
  echo "worker: {$data} ({$dataSize}) \n";

  $tmp = 0;
  $mid = $dataSize / 2;
  for($ix = 0; $ix < $mid; ++$ix) {
    $tmp = $data[$ix];
    $data[$ix] = $data[$dataSize - $ix - 1];
    $data[$dataSize - $ix - 1] = $tmp;

    //这里发送状态,会被client设置的回调reverse_status()接收到
    //状态完成情况的分子与分母
    $job->sendStatus($ix + 1, $mid + 1);
    //发送数据,被reverse_data()接收到
    $job->sendData($data);
    sleep(1);
  }
  return $data;
});
while($worker->work());

运行结果如下:

gearman中任务的优先级和返回状态实例分析

gearman中任务的优先级和返回状态实例分析

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php判断变量类型常用方法
Apr 24 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
php实现利用phpexcel导出数据
Aug 24 PHP
php取整函数ceil,floo,round的用法及介绍
Aug 31 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
Aug 03 PHP
PHP区块查询实现方法分析
May 12 PHP
PHP面向对象程序设计之对象的遍历操作示例
Jun 12 PHP
Laravel模糊查询区分大小写的实例
Sep 29 PHP
PHP dirname简单使用代码实例
Nov 13 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 #PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 #PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 #PHP
php使用gearman进行任务分发操作实例详解
Feb 26 #PHP
php实现根据身份证获取精准年龄
Feb 26 #PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 #PHP
PHP实现创建一个RPC服务操作示例
Feb 23 #PHP
You might like
使用 php4 加速 web 传输
2006/10/09 PHP
php 安全过滤函数代码
2011/05/07 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
php常量详细解析
2015/10/27 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
动态表格Table类的实现
2009/08/26 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
js实现缓动动画
2020/11/25 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
Python 流程控制实例代码
2009/09/25 Python
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
Python实现简单的四则运算计算器
2016/11/02 Python
python opencv实现运动检测
2018/07/10 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
一些PHP的面试题
2015/05/06 面试题
成功的餐厅经营创业计划书
2014/01/15 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
大学生村官个人总结
2015/02/15 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
施工安全责任协议书
2016/03/23 职场文书
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL