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 常用类整理
Dec 23 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 PHP
php实现的常见排序算法汇总
Sep 08 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
Jan 08 PHP
PHP查询大量数据内存耗尽问题的解决方法
Oct 28 PHP
Fleaphp常见函数功能与用法示例
Nov 15 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
Nov 30 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 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调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
php实现websocket实时消息推送
2018/03/30 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
javascript 常用方法总结
2009/06/03 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
python获取糗百图片代码实例
2013/12/18 Python
让Python代码更快运行的5种方法
2015/06/21 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
关于Numpy数据类型对象(dtype)使用详解
2019/11/27 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
办理护照介绍信
2014/01/16 职场文书
建筑安全生产目标责任书
2014/07/23 职场文书
高中同学会活动方案
2014/08/14 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
房产分割协议书范文
2014/11/21 职场文书
音乐教师求职信范文
2015/03/20 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS