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』PHP截断函数mb_substr()使用介绍
Apr 22 PHP
PHP中time(),date(),mktime()区别介绍
Sep 28 PHP
php配置php-fpm启动参数及配置详解
Nov 04 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
Jun 09 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
Jun 27 PHP
php上传文件常见问题总结
Feb 03 PHP
[原创]php获取数组中键值最大数组项的索引值
Mar 17 PHP
PHP批量生成图片缩略图的方法
Jun 18 PHP
PHP读取大文件末尾N行的高效方法推荐
Jun 03 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
Laravel实现批量更新多条数据
Apr 06 PHP
php去除deprecated的实例方法
Nov 17 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
4.与数据库的连接
2006/10/09 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
javascript时间函数基础介绍
2013/03/28 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
vue配置nprogress实现页面顶部进度条
2019/09/21 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
vue中echarts引入中国地图的案例
2020/07/28 Javascript
Python实现的Excel文件读写类
2015/07/30 Python
Python 调用Java实例详解
2017/06/02 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
解决pandas使用read_csv()读取文件遇到的问题
2018/06/15 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
python 整数越界问题详解
2019/06/27 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
意大利在线药房:Saninforma
2021/02/11 全球购物
《兰亭集序》教学反思
2014/02/11 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
技能比武方案
2014/05/21 职场文书
倡议书的写法
2014/08/30 职场文书
幼儿园国庆节活动总结
2015/03/23 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python
如何利用golang运用mysql数据库
2022/03/13 Golang
在windows server 2012 r2中安装mysql的详细步骤
2022/07/23 Servers