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获得当前的脚本网址
Dec 10 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
关于UEditor编辑器远程图片上传失败的解决办法
Aug 31 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
php数组添加元素方法小结
Dec 20 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
Jun 06 PHP
Yii清理缓存的方法
Jan 06 PHP
Composer设置忽略版本匹配的方法
Apr 27 PHP
php+redis消息队列实现抢购功能
Feb 08 PHP
阿里对象存储OSS在laravel框架中的使用方法
Oct 13 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 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
BBS(php &amp; mysql)完整版(一)
2006/10/09 PHP
PHP 编程安全性小结
2010/01/08 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
Vue前端项目部署IIS的实现
2020/01/06 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
人力资源主管职责范本
2014/03/05 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
房屋授权委托书范本
2014/10/07 职场文书
黄山导游词
2015/01/31 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android