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 相关文章推荐
一个简单的自动发送邮件系统(一)
Oct 09 PHP
开发大型 PHP 项目的方法
Jan 02 PHP
用PHP调用Oracle存储过程的方法
Sep 12 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
Nov 02 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
Dec 05 PHP
PHP的拦截器实例分析
Nov 03 PHP
php支付宝手机网页支付类实例
Mar 04 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
php 在字符串指定位置插入新字符的简单实现
Jun 28 PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 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小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
PHP使用token防止表单重复提交的方法
2016/04/07 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
jQuery代码优化 遍历篇
2011/11/01 Javascript
JS window对象的top、parent、opener含义介绍
2013/12/03 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
JS实现左右拖动改变内容显示区域大小的方法
2015/10/13 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
js模拟支付宝密码输入框
2017/04/11 Javascript
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
javascript获取元素的计算样式
2019/05/24 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
python 实现多维数组(array)排序
2020/02/28 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
Python多线程正确用法实例解析
2020/05/30 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
软件测试笔试题
2012/10/25 面试题
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
使用pytorch实现线性回归
2021/04/11 Python
分享MySQL常用 内核 Debug 几种常见方法
2022/03/17 MySQL
Python实现日志实时监测的示例详解
2022/04/06 Python