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的类树(支持无限分类)
Oct 09 PHP
php批量缩放图片的代码[ini参数控制]
Feb 11 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
Apr 23 PHP
深入phpMyAdmin的安装与配置的详细步骤
May 07 PHP
php记录代码执行时间(实现代码)
Jul 05 PHP
php获取淘宝分类id示例
Jan 16 PHP
linux使用crontab实现PHP执行计划定时任务
May 10 PHP
CI框架安全类Security.php源码分析
Nov 04 PHP
php查询相似度最高的字符串的方法
Mar 12 PHP
WordPress中自定义后台管理界面配色方案的小技巧
Dec 29 PHP
Yii框架弹出框功能示例
Jan 07 PHP
php上传后台无法收到数据解决方法
Oct 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
十天学会php之第六天
2006/10/09 PHP
php中的观察者模式
2010/03/24 PHP
php日历制作代码分享
2014/01/20 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
详解Vue用axios发送post请求自动set cookie
2017/05/10 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
2017/05/12 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
python实现决策树分类算法
2017/12/21 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
python编写实现抽奖器
2020/09/10 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
EJB发布WEB服务一般步骤
2012/10/31 面试题
计划生育标语
2014/06/23 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
python 提取html文本的方法
2021/05/20 Python
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript