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:风雨欲来 路在何方?
Oct 09 PHP
我用php+mysql写的留言本
Oct 09 PHP
如何使用PHP计算上一个月的今天
May 23 PHP
Codeigniter整合Tank Auth权限类库详解
Jun 12 PHP
浅析get与post的一些特殊情况
Jul 28 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
Oct 15 PHP
php查找字符串出现次数的方法
Dec 01 PHP
php使用正则表达式获取图片url的方法
Jan 16 PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 PHP
php将文件夹打包成zip文件的简单实现方法
Oct 04 PHP
PHP云打印类完整示例
Oct 15 PHP
PHP 传输会话curl函数的实例详解
Sep 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
如何获得PHP相关资料
2006/10/09 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
javascript smipleChart 简单图标类
2011/01/12 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
jQuery之按钮组件的深入解析
2013/06/19 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
详解React native fetch遇到的坑
2018/08/30 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
Python tkinter label 更新方法
2018/10/11 Python
python 自动重连wifi windows的方法
2018/12/18 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
快递业务员岗位职责
2014/01/06 职场文书
小溪流的歌教学反思
2014/02/13 职场文书
迎国庆演讲稿
2014/09/05 职场文书
师德先进个人材料
2014/12/20 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
护士岗位竞聘书
2015/09/15 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
Redis可视化客户端小结
2021/06/10 Redis
Python利用FlashText算法实现替换字符串
2022/03/31 Python