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设计模式  Command(命令模式)
Jun 17 PHP
windows下zendframework项目环境搭建(通过命令行配置)
Dec 06 PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 PHP
使用swoole扩展php websocket示例
Feb 13 PHP
使用ob系列函数实现PHP网站页面静态化
Aug 13 PHP
PHP链表操作简单示例
Oct 15 PHP
CI(CodeIgniter)框架实现图片上传的方法
Mar 24 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
php微信公众号开发之音乐信息
Oct 20 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
May 09 PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
Oct 21 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 柱状图实现代码
2009/12/04 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
php中{}大括号是什么意思
2013/12/01 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python简单分割文件的方法
2015/07/30 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
C语言面试题
2013/05/19 面试题
室内设计专业个人的自我评价
2013/12/18 职场文书
公司建议书怎么写
2014/05/15 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书