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 相关文章推荐
Discuz!下Memcache缓存实现方法
May 28 PHP
php统计文件大小,以GB、MB、KB、B输出
May 29 PHP
在windows服务器开启php的gd库phpinfo中未发现
Jan 13 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
php使用递归计算文件夹大小
Dec 24 PHP
CodeIgniter删除和设置Cookie的方法
Apr 07 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
Feb 18 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
PHP 年月日的三级联动实例代码
May 24 PHP
Yii2实现ActiveForm ajax提交
May 26 PHP
php创建类并调用的实例方法
Sep 25 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+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
php 修改密码实现代码
2017/05/24 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
python中requests库session对象的妙用详解
2017/10/30 Python
简单了解Django模板的使用
2017/12/20 Python
Django框架视图介绍与使用详解
2019/07/18 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
python 利用toapi库自动生成api
2020/10/19 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
毕业研究生的自我鉴定
2013/11/30 职场文书
计算机求职自荐信范文
2014/04/19 职场文书
协议书怎么写
2014/04/21 职场文书
协议书范本
2014/04/23 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
小组口号霸气押韵
2015/12/24 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书
JS封装cavans多种滤镜组件
2022/02/15 Javascript
Python3的进程和线程你了解吗
2022/03/16 Python
Windows server 2016服务器基本设置
2022/08/14 Servers