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 相关文章推荐
支持php4、php5的mysql数据库操作类
Jan 10 PHP
php 字符转义 注意事项
May 27 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
Jun 21 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
Jul 02 PHP
php动态变量定义及使用
Jun 10 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
PHP实现的登录,注册及密码修改功能分析
Nov 25 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
Laravel框架中自定义模板指令总结
Dec 17 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 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得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
php实现复制移动文件的方法
2015/07/29 PHP
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
AngularJS入门教程之数据绑定用法示例
2016/11/01 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
Python的函数的一些高阶特性
2015/04/27 Python
python中cPickle类使用方法详解
2018/08/27 Python
详解python做UI界面的方法
2019/02/27 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
python实现横向拼接图片
2020/03/23 Python
golang/python实现归并排序实例代码
2020/08/30 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
购买一个高级域名:BuyDomains
2018/03/11 全球购物
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
女士鞋子、包包和服装在线,第一款10美元:ShoeDazzle
2019/07/26 全球购物
印刷工程专业应届生求职信
2013/09/29 职场文书
活动宣传策划方案
2014/05/23 职场文书
宣传活动总结范文
2014/07/01 职场文书
总经理检讨书
2014/09/15 职场文书
工作证明英文模板
2014/10/21 职场文书
社区重阳节活动总结
2015/03/24 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers