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中利用XML技术构造远程服务(上)
Oct 09 PHP
php 不同编码下的字符串长度区分
Sep 26 PHP
PHP 数组基础知识小结
Aug 20 PHP
php中对2个数组相加的函数
Jun 24 PHP
php判断手机访问还是电脑访问示例分享
Jan 20 PHP
19个超实用的PHP代码片段
Mar 14 PHP
php静态文件返回304技巧分享
Jan 06 PHP
PHP实现QQ空间自动回复说说的方法
Dec 02 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
php微信开发自定义菜单
Aug 27 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 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/12/25 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
2011/10/03 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
js创建数组的简单方法
2016/07/27 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
详解Python的单元测试
2015/04/28 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
浅谈CSS3 动画卡顿解决方案
2019/01/02 HTML / CSS
打印机墨盒:123Inkjets
2017/02/16 全球购物
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
社区工作者先进事迹
2014/01/18 职场文书
个人租房协议书
2014/04/09 职场文书
机电专业求职信
2014/06/14 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
golang 实现菜单树的生成方式
2021/04/28 Golang
如何利用pygame实现打飞机小游戏
2021/05/30 Python