gearman-client与gearman-worker的示例源码-C++版

windows平台下Gearman的一个Worker和Client实例,C++实现 由于最近工作需要,要涉及Gearman的Client和worker的开发工作,所以研究了一下环境搭建和Client、Worker的开发。 环境搭建工作就不多说了,网上资料很多,不管是部署在linux上(常规方式)还是通过cygwin方式部署到windows上,都是可行的。 linux方式部署安装步骤大家可以参考这个文章: http://blog.chinaunix.net/uid-2 阅读详情
官方的DEMO如下:
​ http://gearman.info/libgearman/examples.html
​ ​
​ 闲言少述,直接上源码:
​client
​
  1. /*
  2.  * File:
  3.  *    simple-gearman-client.cpp
  4.  * Auth:
  5.  * Hank(hongkuiyan@yeah.net)
  6.  * Desc:
  7.  * Example code to show how to send a string to a function called "test_function" .
  8.  * Cypt:
  9.  * Gearman server and library Version 1.1.12
  10.  * Compile:
  11.  * gcc -o simple-gearman-client simple-gearman-client.cpp -I/usr/local/gearman/include -L/usr/local/gearman/lib -lgearman 
  12.  * Usage:
  13.  * ./simple-gearman-client 
  14.  */

  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <unistd.h>
  19. #include <libgearman/gearman.h>

  20. using namespace std;

  21. int main(int argc, char* argv[])
  22. {
  23.     gearman_return_t gearRet;
  24.     gearman_client_st* gearClient;
  25.     
  26.     char* gearSvrHost=(char*)"10.10.13.8", *gearSvrPort=(char*)"4730";

  27.     gearClient = gearman_client_create(NULL);
  28.     gearman_client_set_options(gearClient, GEARMAN_CLIENT_FREE_TASKS);
  29.     gearman_client_set_timeout(gearClient, 15000);

  30.     gearRet = gearman_client_add_server(gearClient, gearSvrHost, atoi(gearSvrPort));
  31.     if (gearman_failed(gearRet))
  32.     {
  33.         return EXIT_FAILURE;
  34.     }

  35. #if 1
  36.     
  37.     for (int i=0; i < 5; i++) 
  38.     { 
  39.         gearRet = gearman_client_do_background(gearClient, 
  40.                     "test_function", 
  41.                     NULL, 
  42.                     "param1 param2 345", 
  43.                     (size_t)strlen("param1 param2 345"), 
  44.                     NULL); 
  45.         if (gearRet == GEARMAN_SUCCESS) 
  46.         { 
  47.             fprintf(stdout, "Work success!\n"); 
  48.         } 
  49.         else if (gearRet == GEARMAN_WORK_FAIL) 
  50.         {
  51.             fprintf(stderr, "Work failed\n"); 
  52.         }
  53.         else if (gearRet == GEARMAN_TIMEOUT) 
  54.         { 
  55.             fprintf(stderr, "Work timeout\n"); 
  56.         } 
  57.         else 
  58.         { 
  59.             fprintf(stderr, "%d,%s\n", gearman_client_errno(gearClient), gearman_client_error(gearClient)); 
  60.         } 
  61.     } 

  62. #endif


  63. #if 0    
  64.     gearman_argument_t gearValue = gearman_argument_make(0, 0, 
  65.         "Reverse Me", strlen("Reverse Me"));
  66.     gearman_task_st* gearTask = gearman_execute(gearClient,
  67.         "reverse", strlen("reverse"),
  68.         NULL, 0,
  69.         NULL,
  70.         &gearValue, 0);
  71.     
  72.     /* If gearman_execute() can return NULL on error */
  73.     if (gearTask == NULL) 
  74.     {
  75.         fprintf(stderr, "Error: %s\n", gearman_client_error(gearClient));
  76.         gearman_client_free(gearClient);
  77.         return EXIT_FAILURE;
  78.     }

  79.     /* Make sure the task was run successfully */
  80.     if (gearman_success(gearman_task_return(gearTask)))
  81.     {
  82.         /* Make use of value */
  83.         gearman_result_st *gearResult= gearman_task_result(gearTask);
  84.         printf("%.*s\n", (int)gearman_result_size(gearResult), gearman_result_value(gearResult));
  85.     }
  86. #endif

  87.     gearman_client_free(gearClient);

  88.     return EXIT_SUCCESS;
  89. }


​worker
​
  1. /*
  2.  * File:
  3.  *    simple-gearman-worker.cpp
  4.  * Auth:
  5.  * Hank(hongkuiyan@yeah.net)
  6.  * Desc:
  7.  * Example code to show how to receive a string to a function called "test_function" 
  8.  * Cypt:
  9.  * Gearman server and library Version 1.1.12
  10.  * Compile:
  11.  * gcc -o simple-gearman-worker simple-gearman-worker.cpp -I/usr/local/gearman/include -L/usr/local/gearman/lib -lgearman 
  12.  * Usage:
  13.  * ./simple-gearman-worker 
  14.  */
  15.  
  16. #include <errno.h> 
  17. #include <stdio.h> 
  18. #include <stdlib.h> 
  19. #include <string.h> 
  20. #include <unistd.h> 
  21. #include <iostream> 

  22. #include <libgearman/gearman.h> 
  23.  
  24. using namespace std;

  25. static void *test_function(gearman_job_st *gearJob, 
  26.     void* context, 
  27.     size_t* resultSize,
  28.     gearman_return_t* gearRet);


  29. int main(int argc, char* argv[])
  30. {
  31.     gearman_return_t gearRet;
  32.     gearman_worker_st* gearWorker;

  33.     char* gearSvrHost=(char*)"10.10.13.8", *gearSvrPort=(char*)"4730";
  34.     char* gearContext = new char(50);

  35.     gearWorker = gearman_worker_create(NULL);
  36.     if (gearWorker == NULL)
  37.     {
  38.         cout << "ERROR: " << gearman_worker_error(gearWorker) << endl;    
  39.         return EXIT_FAILURE;    
  40.     }    

  41.     gearRet = gearman_worker_add_server(gearWorker, gearSvrHost, atoi(gearSvrPort));
  42.     if (gearman_failed(gearRet))
  43.     {
  44.         cout << "ERROR: " << gearman_worker_error(gearWorker) << endl;    
  45.         return EXIT_FAILURE;
  46.     }

  47.     gearRet = gearman_worker_add_function(gearWorker, 
  48.         "test_function", 
  49.         0, 
  50.         test_function, 
  51.         gearContext);
  52.     if (gearman_failed(gearRet))
  53.     {
  54.         cout << "ERROR: " << gearman_worker_error(gearWorker) << endl;    
  55.         return EXIT_FAILURE;
  56.     }

  57.     cout << "waiting for job ... " << endl;

  58.     while (1)
  59.     {
  60.         gearRet = gearman_worker_work(gearWorker);
  61.         if (gearman_failed(gearRet))
  62.         {
  63.             cout << "ERROR: " << gearman_worker_error(gearWorker) << endl;
  64.             break;
  65.         }
  66.     }

  67.     delete gearContext;
  68.     gearman_worker_free(gearWorker);

  69.     return EXIT_SUCCESS;

  70. }

  71. static void *test_function(gearman_job_st *gearJob, 
  72.     void *context, 
  73.     size_t *resultSize,
  74.     gearman_return_t *gearRet)
  75. {
  76.     cout << "\n\njob :" << gearman_job_handle(gearJob) << endl;
  77.     cout << "context :" << (char*)context << endl;

  78.     char *jobWorkload = (char*)gearman_job_workload(gearJob);
  79.     size_t jobWorkloadSize = gearman_job_workload_size(gearJob);


  80.     char *jobRequest = new char[1024];
  81.     jobRequest = (char*)malloc(1024);
  82.     if (jobRequest == NULL)
  83.     {
  84.         cout << "new jobRequest failed" << errno << endl;
  85.         *gearRet = GEARMAN_WORK_FAIL;
  86.         return NULL;
  87.     }

  88.     snprintf((char*)jobRequest, jobWorkloadSize+1, (char*)jobWorkload);
  89.     cout<<"job = "<< gearman_job_handle(gearJob) << " jobWorkloadSize=" << jobWorkloadSize << " jobRequest=" <<jobRequest << endl;

  90.     char *jobResult = new char[1024];
  91.     if (jobResult == NULL)
  92.     {
  93.         cout <<"new jobResult failed" << errno << endl;
  94.         *gearRet = GEARMAN_WORK_FAIL;
  95.         return NULL;
  96.     }


  97.     sprintf((char*)jobResult, "%s->jobResult", (char*)jobRequest);
  98.     size_t jobResultSize = strlen((char*)jobResult);
  99.     cout <<"job = "<< gearman_job_handle(gearJob) << " jobResultSize=" << jobResultSize << " jobResult=" << jobResult << endl;


  100.     delete []jobResult;
  101.     delete []jobRequest;

  102.     *gearRet = GEARMAN_SUCCESS;
  103.     return NULL;
  104. }
GearMAN讲解及所带来的变革 GearMAN讲解及所带来的变革 全面介绍Gearman原理、应用 立即下载

相关推荐

Gearman C# API和示例

Gearman 的C#开发API和一个简单自带demo,vs2008.

Gearman的安装和使用

首发于 樊浩柏科学院 Gearman 是一个分布式任务分发系统,通过程序调用(API,跨语言)分布式地把工作委派给更适合做某项工作的机器,且这些机器可以以并发的、负载均衡的形式来共同完成某项工作。当计算密集型场景时,适合在后台使用 Gearman 异步地运行工作任务。 认识Gearman Gearman 只是一个分布式程序调用框架,其...

weixin_33874713的博客 1289

三相逆变器拓扑结构的分析及应用场景

三相逆变器是电力电子领域中广泛应用的一种设备,用于将直流电转换为交流电。不同的拓扑结构在性能、成本、复杂度和应用领域上存在差异。小编将在本文中将进一步拓展对三相逆变器拓扑结构的分析,并探讨其适用的应用场景。

道合顺的博客 2235

gearman入门简介

一、Gearman介绍 gearman,从名字上看叫做“齿轮工”,就是通过齿轮把不同的组件组合在一起。 通常,多语言多系统之间的集成是项目开发中一个比较头疼的问题。 一般会采用RPC风格或者是REST风格的WebService。但是总感觉比较麻烦。 gearman就应运而生了,作为一个任务分发架构, 它能够轻松的将前端的任务通过Job Server分发给后端的Worker处理。 G

北雨南萍 1349

西门子S7-1500 PLC模块化编程与生产线自动化实践

PLC(可编程逻辑控制器)作为工业自动化核心设备,其模块化编程技术能显著提升产线控制系统的开发效率。通过SCL高级语言实现算法封装、功能块(FB)复用等工程实践,可构建稳定可靠的分层式控制架构。本文以西门子TIA Portal平台为例,详解S7-1500系列PLC在汽车零部件产线中的标准化应用方案,包含配方管理、设备联动等典型场景的SCL实现,以及Profinet通信、虚拟轴同步等进阶技巧。特别适用于需要快速实施中大型生产线自动化改造的工程师,提供经过验证的异常处理机制和模块化设计规范。

weixin_34341229的博客 457

告别Qt Creator?手把手教你用VSCode+MinGW调试QT项目(附完整launch.json配置)

本文详细介绍了如何在VSCode中配置完整的QT开发环境,特别是针对使用MinGW编译器的用户。从环境搭建到调试配置,包括生成.pro文件、Makefile,以及配置task.json和launch.json文件,帮助开发者高效调试QT项目。

weixin_27180827的博客 186

gearman使用心得

本质上,gearman可以认为是一个分布式任务队列,client是生产者,worker则是消费者。gearman并不主动分发任务,而是由worker到它那里去取任务执行,所以它采用的是类似kafka的pull消费模式。

tlxamulet的博客 587

PMF5.0计算

EPA PMF5.0 计算步骤

nuistsy的博客 4541

Gearman介绍、原理分析、实践改进

gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调用,适合在后台运行工作任务。最初是2005年perl版本,2008年发布C/C++版本。目前大部分源码都是(Gearmand服务job Server)C++,各个API实现有各种语言的版本。PHP的Client API与Worker API实现为C扩展,在PHP官方网站有此扩展的中英文文档。 gearman架构中的...

dianfu2892的博客 442

游戏资源解包神器NSCB实战:手把手教你提取Switch游戏视频(nsm转MP4)

本文详细介绍了如何使用NSCB工具链从Switch游戏中提取nsm视频和hca音频资源,并将其转换为可编辑的MP4和MP3格式。通过NSC Builder、CriPakTools等工具的分步操作指南,帮助内容创作者高效获取游戏资源,同时提供音视频同步合成、批量处理等高级技巧,为创意素材制作提供完整解决方案。

weixin_29197835的博客 888

GD32H7 SPI驱动实战:手把手教你用SPI3连接外部Flash(W25Q128)并实现读写

本文详细介绍了基于GD32H7系列MCU的SPI3接口驱动W25Q128外部Flash的全流程开发指南。从硬件设计、引脚配置到SPI3外设深度配置,再到底层通信函数实现和高级功能优化,提供了完整的解决方案。特别针对高速读取、DMA传输和信号完整性等关键环节进行了优化,确保系统在-40℃~85℃范围内稳定工作。

weixin_28729205的博客 380

Gearman介绍、调研、测试与原理分析

gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调用,适合在后台运行工作任务。最初是2005年perl版本,2008年发布C/C++版本。目前大部分源码都是(Gearmand服务job Server)C++,各个API实现有各种语言的版本。PHP的Client API与Worker API实现为C扩展,在PHP官方网站有此扩展的中英文文档。 gearman架构中的三

大鹏 3212

【滚雪球学数学建模】第4.1节·概率与统计建模,一文搞懂!

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 1348

gearmand与Docker集成:简化分布式任务队列部署的完整教程

gearmand是一款高效的分布式任务队列系统,能够帮助开发者轻松构建异步处理架构。通过Docker集成,你可以在几分钟内完成gearmand服务的部署与配置,无需担心复杂的环境依赖问题。本教程将带你一步步实现gearmand与Docker的无缝集成,从基础部署到高级配置,让分布式任务处理变得前所未有的简单。 ## 📦 为什么选择Docker部署gearmand? Docker容器化技术为g

gitblog_00995的博客 1054

Android 14.0 开机广播接收慢广播延迟问题分析

在14.0的系统rom定制化开发中,在某些时候在接收开机广播的时候发现,过了一分钟才收到开机广播,接下来就需要分析下 开机广播的相关分发机制,来处理下相关问题

安卓兼职framework和app工程师的博客 631

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

如何在3分钟内使用Docker部署gearmand分布式任务队列系统

gearmand是一个强大的分布式任务队列系统,为现代应用提供了高效的任务分发和处理框架。通过Docker容器化技术,我们可以将复杂的分布式任务队列部署简化为几分钟的操作,同时确保环境一致性和系统可靠性。本文将深入探讨如何利用Docker快速部署gearmand,并展示其在微服务架构中的实际应用价值。 ## 📊 为什么选择gearmand作为分布式任务队列解决方案 在当今的微服务架构中,异步

gitblog_00209的博客 965

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++ error: ISO C++ forbids declaration of with no type

https://www.allegro.cc/forums/thread/594307 It is important to understand what the problem here is. The actual problem is this. game.h includes player.h, and player.h includes game.h. So, when the com...

lzxjxsy的博客 1685

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

分布式框架-Gearman

特点Gearman是一个分布式应用程序框架,支持同步、异步任务处理,负载均衡以及跨语言调用。通过Gearman,在WEB应用中可以将复杂的业务逻辑交给其它更适合的机器或进程,甚至不同的语言处理。Gearman是分布式计算的神经中枢,它具有以下特性:1.开源免费。Gearman有一个很活跃的开源社区,提供了比较丰富的资源。2.多语言支持。Gearman提供了多语言接口支持,可以...

weixin_33979203的博客 162

Gearman-任务分发系统

简介 Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,Gearman更偏向于任务分发功能。 Gearman提供了一个通用的应用程序,可以工作在更加适合处理这项任务的其他计算机或其他处理器上。它允许并行处理,载入平衡处理,而且可以在不同语言间进行调用。它可以应用于各种各样的应用场合。 Gearman最初用于LiveJournal的图片resize功能,由于图片

zl 2710

gearman_在多个环境中部署Gearman

现代计算环境的最大挑战之一是计算资源的分配和有效利用。 当前的总体计算趋势是,您可以廉价,轻松地安装功能强大的计算机来执行相对简单明了的任务,但是您可能无法获得最佳的计算机整体性能或使用率。 相反,现在许多应用程序需要执行相对较小的操作,但可能需要执行数百或数千次,而无需(或无法使用)单台机器的功能。 随着计算场规模的增加,有时需要跨所有这些计算机同时或选择性地执行操作或操作以执行管理或安...

cuxiong8996的博客 351

Gearman框架的研究(一)

以下内容来自www.geraman.org 1.Gearman介绍 Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。Gearman是一个分发任务的程序框架,可以用在各种场合,Gearman的提供了一个通用框架,它可以让你做的工作并行,负载平衡处理,并调用函数语言之间。它可用于在各种各...

prettyzhou的专栏 227

MySQL+Redis缓存+Gearman共同构建数据库缓存

利用MySQL的UDF函数配置Redis的缓存节点进行对于数据库的缓存优化方案

b_______的博客 815

Gearman 项目使用与配置指南

Gearman 项目使用与配置指南 1. 项目目录结构及介绍 Gearman 项目是一个用于分布式任务队列的框架,其目录结构如下: benchmark/: 包含性能测试相关的代码和脚本。 bin/: 存放了一些可执行的脚本和工具。 contrib/: 一些贡献的代码,包括补丁和插件。 docs/: 项目文档,包括API文档和使用说明。 examples/: 包含了一些使用Gearman的示例代码...

gitblog_01022的博客 512

gearman 入门使用笔记

一、简介gearman是可以把工作委派到其它机器或进程的工具。 官网地址:http://gearman.org/Gearman通常由三部分组成,client+worker+任务服务器,由worker执行client发来的job,再通过job server返回给client。Gearman提供了Client、Worker的API,利用这些API来与job server通讯。 这是工作原理图: 二

猿来这样-谢厂节的博客 1万+

gearman的安装与使用示例

一, gearman的安装 1.1. gearman工作原理 Gearman 服务有很多要素使得它不仅仅是一种提交和共享工作的方式, 但是主要的系统只由三个组件组成:      gearmand 守护进程(server),     用于向 Gearman 服务提交请求的 client ,     执行实际工作的 worker。 其关系如下图所示:  Fig 1. gearm

北雨南萍 1884
上一篇: Gearman的源码编译与安装
下一篇: ffmpeg的avcodec_open或avcodec_open2()的线程安全问题
北雨南萍
北雨南萍 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄20年 2665粉丝 453原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北雨南萍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值