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+javascript液晶时钟
Oct 09 PHP
php Sql Server连接失败问题及解决办法
Aug 07 PHP
深入apache host的配置详解
Jun 09 PHP
php使用qr生成二维码的示例分享
Jan 20 PHP
yii实现级联下拉菜单的方法
Jul 31 PHP
php中call_user_func函数使用注意事项
Nov 21 PHP
php判断用户是否手机访问代码
Jun 08 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
Apr 01 PHP
PHP进行批量任务处理不超时的解决方法
Jul 11 PHP
简单实现php上传文件功能
Sep 21 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
May 12 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
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
php生成短域名函数
2015/03/23 PHP
PHP错误处理函数
2016/04/03 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
关于Vue.nextTick()的正确使用方法浅析
2017/08/25 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
python读取浮点数和读取文本文件示例
2014/05/06 Python
Python中__call__用法实例
2014/08/29 Python
python实现备份目录的方法
2015/08/03 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
Python:slice与indices的用法
2019/11/25 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
HTML5中使用postMessage实现两个网页间传递数据
2016/06/22 HTML / CSS
详解HTML5将footer置于页面最底部的方法(CSS+JS)
2018/10/11 HTML / CSS
《埃及的金字塔》教学反思
2014/04/07 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
学校领导班子对照检查材料
2014/09/24 职场文书
迁户口计划生育证明
2014/10/19 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
正规借条模板
2015/05/26 职场文书
MySQL三种方式实现递归查询
2022/04/18 MySQL
小程序自定义轮播图圆点组件
2022/06/25 Javascript