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框架Phpbean说明
Jan 10 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
thinkphp3.2.2前后台公用类架构问题分析
Nov 25 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
详解PHP对象的串行化与反串行化
Jan 24 PHP
php分页原理 分页代码 分页类制作教程
Sep 23 PHP
php获取'/'传参的值简单方法
Jul 13 PHP
Laravel中使用Queue的最基本操作教程
Dec 27 PHP
PHP实现websocket通信的方法示例
Aug 28 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 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网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
分析在Python中何种情况下需要使用断言
2015/04/01 Python
python获取多线程及子线程的返回值
2017/11/15 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
美国围栏公司:Walpole Outdoors
2019/11/19 全球购物
优秀大学生推荐信范文
2013/11/28 职场文书
医院护士的求职信范文
2013/12/26 职场文书
酒店保安领班职务说明书
2014/03/04 职场文书
地球一小时倡议书
2014/04/15 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
颐和园英文导游词
2015/01/30 职场文书
植物园观后感
2015/06/11 职场文书
公司规章制度范本
2015/08/03 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers