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 相关文章推荐
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
May 03 PHP
php去掉字符串的最后一个字符附substr()的用法
Mar 23 PHP
PHP中redis的用法深入解析
Feb 20 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
Oct 22 PHP
php类中的各种拦截器用法分析
Nov 03 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
基于PHP实现短信验证码接口(容联运通讯)
Sep 06 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
PHP时间函数使用详解
Mar 21 PHP
Laravel手动返回错误码示例
Oct 22 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
一个ubbcode的函数,速度很快.
2006/10/09 PHP
php 数组的创建、调用和更新实现代码
2009/03/09 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
CI框架中zip类应用示例
2014/06/17 PHP
Yii清理缓存的方法
2016/01/06 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
EsLint入门学习教程
2017/02/17 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
微信小程序实现可长按移动控件
2020/11/01 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Python实现数据库并行读取和写入实例
2017/06/09 Python
python实现狄克斯特拉算法
2019/01/17 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
常务副总经理岗位职责
2014/04/12 职场文书
保护环境建议书300字
2014/05/13 职场文书
企业标语口号
2014/06/10 职场文书
学校班班通实施方案
2014/06/11 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL
springboot如何初始化执行sql语句
2021/06/22 Java/Android
python之json文件转xml文件案例讲解
2021/08/07 Python