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-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
Aug 15 PHP
支持png透明图片的php生成缩略图类分享
Feb 08 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
Jul 29 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
Nov 09 PHP
ThinkPHP静态缓存简单配置和使用方法详解
Mar 23 PHP
PHP命名空间和自动加载类
Apr 03 PHP
yii2控制器Controller Ajax操作示例
Jul 23 PHP
PHP利用二叉堆实现TopK-算法的方法详解
Apr 24 PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 PHP
php 策略模式原理与应用深入理解
Sep 25 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 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中加密解密函数与DES加密解密实例
2014/10/17 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
IE6下拉框图层问题探讨及解决
2014/01/03 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
基于Python的XSS测试工具XSStrike使用方法
2017/07/29 Python
python 反向输出字符串的方法
2018/07/16 Python
python异步存储数据详解
2019/03/19 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
文科教师毕业的自我评价
2014/01/16 职场文书
生物制药自我鉴定
2014/01/25 职场文书
九年级语文教学反思
2014/02/04 职场文书
结对共建工作方案
2014/06/02 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
群众路线领导对照材料
2014/08/23 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
实习员工转正的评语汇总,以备不时之需
2019/12/17 职场文书
css height属性中的calc方法详解
2021/06/03 HTML / CSS