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 相关文章推荐
如何做到多笔资料的同步
Oct 09 PHP
实用函数2
Nov 08 PHP
php Ajax乱码
Apr 09 PHP
PHP中常用数组处理方法实例分析
Aug 30 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
Aug 16 PHP
单台服务器的PHP进程之间实现共享内存的方法
Jun 13 PHP
ThinkPHP提交表单时默认自动转义的解决方法
Nov 25 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
php下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
php实现的xml操作类
2016/01/15 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
Active控件问题小结(附解决办法)
2016/06/09 Javascript
javascript的几种写法总结
2016/09/30 Javascript
jQuery实现按比例缩放图片的方法
2017/04/29 jQuery
3种vue路由传参的基本模式
2018/02/22 Javascript
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
2019/09/25 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
jquery实现抽奖功能
2020/10/22 jQuery
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
python实现SMTP邮件发送功能
2020/06/16 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
python机器学习库常用汇总
2017/11/15 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
python 高阶函数简单介绍
2021/02/19 Python
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
大学生活动总结怎么写
2014/04/29 职场文书
生日宴会策划方案
2014/06/03 职场文书
工程承包协议书
2014/10/20 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
Python使用pyecharts控件绘制图表
2022/06/05 Python