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 相关文章推荐
PHPMailer邮件发送的实现代码
May 04 PHP
php不使用插件导出excel的简单方法
Mar 04 PHP
完善CodeIgniter在IDE中代码提示功能的方法
Jul 19 PHP
php购物车实现方法
Jan 03 PHP
PHP stream_context_create()函数的使用示例
May 12 PHP
PHP常用设计模式之委托设计模式
Feb 13 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 PHP
Yii2.0中使用js异步删除示例
Mar 10 PHP
thinkPHP框架中执行原生SQL语句的方法
Oct 25 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 PHP
php微信开发之谷歌测距
Jun 14 PHP
php判断电子邮件是否正确方法
Dec 04 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中的实现trim函数代码
2007/03/19 PHP
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
JavaScript版代码高亮
2006/06/26 Javascript
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
2012/12/11 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
javascript带回调函数的异步脚本载入方法实例分析
2015/07/02 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python 布尔操作实现代码
2013/03/23 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
jupyter 添加不同内核的操作
2021/02/06 Python
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
亲子读书活动方案
2014/02/22 职场文书
师德师风自我评价范文
2014/09/11 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
初婚未育证明样本
2015/06/18 职场文书
小学生安全教育心得体会
2016/01/15 职场文书