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 开发环境配置(Zend Studio)
Apr 28 PHP
php $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
Jun 21 PHP
浅析get与post的一些特殊情况
Jul 28 PHP
如何让搜索引擎抓取AJAX内容解决方案
Aug 25 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
php+xml编程之SimpleXML的应用实例
Jan 24 PHP
php中stdClass的用法分析
Feb 27 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
Jul 01 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
Aug 17 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 PHP
浅谈如何提高PHP代码质量之端到端集成测试
May 28 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
SONY SRF-40W电路分析
2021/03/02 无线电
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
10 个经典PHP函数
2013/10/17 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
php生成RSS订阅的方法
2015/02/13 PHP
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
2017/08/29 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
Vue加载json文件的方法简单示例
2019/01/28 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
[14:56]教你分分钟做大人:巫医
2014/10/30 DOTA
wxPython的安装图文教程(Windows)
2017/12/28 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python print出共轭复数的方法详解
2019/06/25 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
Python参数传递机制传值和传引用原理详解
2020/05/22 Python
Python实现石头剪刀布游戏
2021/01/20 Python
如何强制垃圾回收
2015/10/06 面试题
金融专业推荐信
2013/11/14 职场文书
公司委托书范本
2014/04/04 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
个人先进材料范文
2014/12/30 职场文书
个性与发展自我评价
2015/03/06 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
健康教育主题班会
2015/08/14 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书