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中模拟POST传递数据的两种方法分享
Sep 16 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
php 解压rar文件及zip文件的方法
May 05 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
PHP文件操作实例总结
Sep 27 PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
PHP中常用的魔术方法
Apr 28 PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
Sep 11 PHP
PHP实现批量修改文件名的方法示例
Sep 18 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/11/25 PHP
用PHP实现图象锐化代码
2007/06/14 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
理解Python中函数的参数
2015/04/27 Python
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
不要用强制方法杀掉python线程
2017/02/26 Python
Django实现自定义404,500页面教程
2017/03/26 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
Python实现二维数组输出为图片
2018/04/03 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
Flask-WTF表单的使用方法
2019/07/12 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Html5页面内使用JSON动画的实现
2019/01/29 HTML / CSS
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
生物科学专业个人求职信范文
2013/12/05 职场文书
开会迟到检讨书
2014/01/08 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
pandas中对文本类型数据的处理小结
2021/11/01 Python