当前位置:首页 > PHP教程 > php高级应用 > 列表

gearman中任务的优先级和返回状态实例分析

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-15 09:57:35 浏览: 评论:0 

本文实例讲述了gearman中任务的优先级和返回状态,分享给大家供大家参考,具体如下:

gearman中任务的优先级和返回状态

一、任务的优先级

同步阻塞调用,等待返回结果

doLow:最低优先

doNomal:正常优先级

doHigh:最优先执行

异步派发任务,不等待返回结果,返回任务句柄,通过该句柄可获取任务运行状态信息

doLowBackground

doBackground

doHighBackground

注意Task和doXXX区别,Task是一组job,派发后会分配到多个worker上并行执行并返回结果给调用方。

而doXXX的每个任务只会在一个worker上执行。

  1. addTaskLow 
  2. addTask 
  3. addTaskHigh 
  4.  
  5. addTaskLowBackground  
  6. addTaskBackground  
  7. addTaskHighBackground 

cli.php代码如下:

  1. <?php 
  2. $client = new GearmanClient(); 
  3. $client->addServer('127.0.0.1', 4730); 
  4. $client->setCompleteCallback(function($task) { 
  5.   echo $task->data(), PHP_EOL; 
  6. }); 
  7. //分别添加不同优先级的Task 
  8. $client->addTaskLow('sum', json_encode(array(100, 100))); 
  9. $client->addTask('sum', json_encode(array(200, 200))); 
  10. $client->addTaskHigh('sum', json_encode(array(300, 300))); 
  11.  
  12. $client->runTasks(); 

worker.php代码如下:

  1. <?php 
  2. $worker = new GearmanWorker(); 
  3. $worker->addServer('127.0.0.1', 4730); 
  4. $worker->addFunction('sum'function($job) { 
  5.   $data = json_decode($job->workload(), true); 
  6.   $ret = $data[0] + $data[1]; 
  7.   echo $ret, PHP_EOL; 
  8.   sleep(1); 
  9.   return $ret
  10. }); 
  11. while($worker->work()); 

注意,为了实验效果,这里worker只需启动一个。

gearman中任务的优先级和返回状态实例分析

二、获取任务的状态

cli.php代码如下:

  1. <?php 
  2. $client = new GearmanClient(); 
  3. $client->addServer('127.0.0.1', 4730); 
  4. //任务排队时的回调 
  5. $client->setCreatedCallback('reverse_create'); 
  6. //有任务数据包时的回调 
  7. $client->setDataCallback('reverse_data'); 
  8. //收集任务状态的回调 
  9. $client->setStatusCallback('reverse_status'); 
  10. //任务完成时的回调 
  11. $client->setCompleteCallback('reverse_complete'); 
  12. //任务失败时的回调 
  13. $client->setFailCallback('reverse_fail'); 
  14. //分别添加不同优先级的Task 
  15. $client->addTaskLow('reverse''1234567'); 
  16. $client->addTask('reverse''hello'); 
  17. $client->addTaskHigh('reverse''world'); 
  18.  
  19. $client->runTasks(); 
  20.  
  21. function reverse_create($task) { 
  22.   echo '任务创建('$task->jobHandle() , '): ', PHP_EOL; 
  23. function reverse_data($task) { 
  24.   echo '接收数据('$task->jobHandle() , '): '$task->data(), PHP_EOL; 
  25. function reverse_status($task) { 
  26.   //taskNumerator()获取任务完成情况的分子 
  27.   //taskDenominator()获取任务完成情况的分母 
  28.   echo '完成情况('$task->jobHandle() , '): '$task->taskNumerator(), '/'$task->taskDenominator(), PHP_EOL; 
  29. function reverse_complete($task) { 
  30.   echo '任务完成('$task->jobHandle() , '): '$task->data(), PHP_EOL; 
  31. function reverse_fail($task) { 
  32.   echo '任务失败('$task->jobHandle() , '): ', PHP_EOL; 

worker.php代码如下:

  1. <?php 
  2. $worker = new GearmanWorker(); 
  3. $worker->addServer('127.0.0.1', 4730); 
  4. $worker->addFunction('reverse'function($job) { 
  5.   //workload()返回接收的数据 
  6.   $data = $job->workload(); 
  7.   //workloadSize()返回接收数据的字节大小 
  8.   $dataSize = $job->workloadSize(); 
  9.   echo "worker: {$data} ({$dataSize}) \n"
  10.  
  11.   $tmp = 0; 
  12.   $mid = $dataSize / 2; 
  13.   for($ix = 0; $ix < $mid; ++$ix) { 
  14.     $tmp = $data[$ix]; 
  15.     $data[$ix] = $data[$dataSize - $ix - 1]; 
  16.     $data[$dataSize - $ix - 1] = $tmp
  17.  
  18.     //这里发送状态,会被client设置的回调reverse_status()接收到 
  19.     //状态完成情况的分子与分母 
  20.     $job->sendStatus($ix + 1, $mid + 1); 
  21.     //发送数据,被reverse_data()接收到 
  22.     $job->sendData($data); 
  23.     sleep(1); 
  24.   } 
  25.   return $data
  26. }); 
  27. while($worker->work()); 

运行结果如下:

gearman中任务的优先级和返回状态实例分析

Tags: gearman任务优先级

分享到: