Gearman分布式任务处理系统(八)开发讲解

集成电路模拟版图入门-版图基础学习笔记(二) 集成电路模拟版图入门知识,今日给大家分享版图基础学习笔记二,器件MOS管、电阻、电容、互联、版图编辑器等。 阅读详情

这篇重点介绍C-Lib库及client和worker的开发,以0.14版libgearman for C来讲解

Client API

client初始化&析构

gearman_client_st *gearman_client_create(gearman_client_st *client)

void gearman_client_free(gearman_client_st *client)

gearman_return_t gearman_client_add_server(gearman_client_st *client, const char *host, in_port_t port);

gearman_return_t gearman_client_add_servers(gearman_client_st *client, const char *servers); (一次添加多个gearman job-server)


同步操作

void * gearman_client_do(gearman_client_st *client, const char *function_name, const char *unique, const void *workload, size_t workload_size, size_t *result_size, gearman_return_t *ret_ptr);

其中:

i. unique: 的作用是client添加job给worker的时候的一个唯一标识,可选,默认是NULL

ii. workload & workload_size指代执行任务的详细参数及其大小

iii. result_size [out],指代返回数据的大小

iv. ret_ptr [out], 指代gearman的返回status,以下是官方对于返回status的一些说明:

In the case of GEARMAN_WORK_DATA, GEARMAN_WORK_WARNING, or GEARMAN_WORK_STATUS, the caller should take any actions to handle the event and then call this function again. This may happen multiple times until a GEARMAN_WORK_ERROR, GEARMAN_WORK_FAIL, or GEARMAN_SUCCESS (work complete) is returned. For GEARMAN_WORK_DATA or GEARMAN_WORK_WARNING, the result_size will be set to the intermediate data chunk being returned and an allocated data buffer will be returned. For GEARMAN_WORK_STATUS, the caller can use gearman_client_do_status() to get the current tasks status.

总而言之,只有GEARMAN_WORK_ERROR/GEARMAN_WORK_FAIL/GEARMAN_SUCCESS才是三个最终的返回结果,其他的只是临时中间结果,需要进一步调用接受结果的函数(感觉中间结果只有在异步调用过程中才会出现)

v. 输出是返回数据的起始地址,一旦用户用完之后,必须free,否则会出现内存泄露。

void gearman_set_timeout(gearman_universal_st *gearman, int timeout);

设置gearman_client_do多长时调用无返回则超时时间


异步callback操作

Gearman通过使用gearman_client_add_task()来望gearman_client_st中添加task,通过gearman_client_set_created_fn() / gearman_client_set_complete_fn()等来注册callback function,通过gearman_client_run_tasks()来运行gearman_client_st中的task。


异步background操作

系统在background运行job,client定期获得job运行结果,如果成功则返回,反之则继续等待。

gearman_return_t gearman_client_do_background(gearman_client_st *client, const char *function_name, const char *unique, const void *workload, size_t workload_size, char *job_handle);

i. job_handle [out]: 一个job的标识符

ii. 输出:返回状态

* gearman_return_t gearman_client_job_status(gearman_client_st *client, gearman_job_handle_t job_handle, bool *is_known, bool * is_running, uint32_t *numerator, uint32_t *denominator);

* 用户获得在background执行的job的状态

i. is_known [out]: Optional parameter to store the known status in

ii. is_running [out]: Optional parameter to store the running status in

iii. numerator [out]: Optional parameter to store the numerator in

iv. denominator [out]: Optional parameter to store the denominator in

PS: 好像background操作不怎么好使,不知道如何通过获得background的运行结果,这个是我一直困惑的


gearman_client_st的一些属性

gearman_client_st一共有以下3种运行属性:

i. GEARMAN_CLIENT_NON_BLOCKING: client运行在non-blocking mode

ii. GEARMAN_CLIENT_FREE_TASKS: 在task执行完成之后,自动的释放task

iii. GEARMAN_CLIENT_UNBUFFERED_RESULT: Allow the client to read data in chunks rather than have the library buffer the entire data result and pass that back。

可以通过函数gearman_client_add_options() / gearman_client_remove_options() / gearman_client_has_option() 等进行属性添加/删除/判断等


Worker API

/**
 * Initialize a worker structure. Always check the return value even if passing
 * in a pre-allocated structure. Some other initialization may have failed. It
 * is not required to memset() a structure before providing it.
 *
 * @param[in] worker Caller allocated structure, or NULL to allocate one.
 * @return On success, a pointer to the (possibly allocated) structure. On
 *  failure this will be NULL.
 */
GEARMAN_API
gearman_worker_st *gearman_worker_create(gearman_worker_st *worker);


/**
 * Free resources used by a worker structure.
 *
 * @param[in] worker Structure previously initialized with
 *  gearman_worker_create() or gearman_worker_clone().
 */
GEARMAN_API
void gearman_worker_free(gearman_worker_st *worker);


/**
 * Add a job server to a worker. This goes into a list of servers that can be
 * used to run tasks. No socket I/O happens here, it is just added to a list.
 *
 * @param[in] worker Structure previously initialized with
 *  gearman_worker_create() or gearman_worker_clone().
 * @param[in] host Hostname or IP address (IPv4 or IPv6) of the server to add.
 * @param[in] port Port of the server to add.
 * @return Standard gearman return value.
 */
GEARMAN_API
gearman_return_t gearman_worker_add_server(gearman_worker_st *worker,
                                           const char *host, in_port_t port);


/**
 * Add a list of job servers to a worker. The format for the server list is:
 * SERVER[:PORT][,SERVER[:PORT]]...
 * Some examples are:
 * 10.0.0.1,10.0.0.2,10.0.0.3
 * localhost LIBGEARMAN_BITFIELD234,jobserver2.domain.com:7003,10.0.0.3
 *
 * @param[in] worker Structure previously initialized with
 *  gearman_worker_create() or gearman_worker_clone().
 * @param[in] servers Server list described above.
 * @return Standard gearman return value.
 */
GEARMAN_API
gearman_return_t gearman_worker_add_servers(gearman_worker_st *worker,
                                            const char *servers);
                                            
/**
 * Register and add callback function for worker. To remove functions that have
 * been added, call gearman_worker_unregister() or
 * gearman_worker_unregister_all().
 *
 * @param[in] worker Structure previously initialized with
 *  gearman_worker_create() or gearman_worker_clone().
 * @param[in] function_name Function name to register.
 * @param[in] timeout Optional timeout (in seconds) that specifies the maximum
 *  time a job should. This is enforced on the job server. A value of 0 means
 *  an infinite time.
 * @param[in] function Function to run when there is a job ready.
 * @param[in] context Argument to pass into the callback function.
 * @return Standard gearman return value.
 */
GEARMAN_API
gearman_return_t gearman_worker_add_function(gearman_worker_st *worker,
                                             const char *function_name,
                                             uint32_t timeout,
                                             gearman_worker_fn *function,
                                             void *context);


/**
 * Wait for a job and call the appropriate callback function when it gets one.
 *
 * @param[in] worker Structure previously initialized with
 *  gearman_worker_create() or gearman_worker_clone().
 * @return Standard gearman return value.
 */
GEARMAN_API
gearman_return_t gearman_worker_work(gearman_worker_st *worker);


/**
 * See gearman_universal_set_timeout() for details.
 */
GEARMAN_API
void gearman_worker_set_timeout(gearman_worker_st *worker, int timeout);


开发实例

下面这个实例程序是,jfy_client发送test,jfy_worker返回test->result

/*
  gearman client 测试程序
  gcc -o jfy_client jfy_client.c -I/usr/local/gearman/include -L/usr/local/gearman/lib -lgearman
  ./jfy_client "this is a test"
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <libgearman/gearman.h>

static void usage(char *name);

int main(int argc, char *argv[])
{
  int i;
  gearman_return_t ret;
  gearman_client_st client;
  char *result;
  size_t result_size;
  uint32_t numerator;
  uint32_t denominator;

  char *host = "localhost", *port = "4730";

  if (gearman_client_create(&client) == NULL)
  {
    fprintf(stderr, "Memory allocation failure on client creation\n");
    exit(1);
  }

  gearman_client_set_options(&client, GEARMAN_CLIENT_FREE_TASKS);
  gearman_client_set_timeout(&client, 15000);

  ret= gearman_client_add_server(&client, host, atoi(port));
  if (ret != GEARMAN_SUCCESS)
  {
    fprintf(stderr, "%s\n", gearman_client_error(&client));
    exit(1);
  }

  for (i=0;i<10;i++)
  {
    result= (char *)gearman_client_do(&client, "jfytest", NULL,
                                      (void *)argv[1],
                                      (size_t)strlen(argv[1]),
                                      &result_size, &ret);
    if (ret == GEARMAN_WORK_DATA)
    {
      printf("Data=%.*s\n", (int)result_size, result);
      free(result);
    }
    else if (ret == GEARMAN_WORK_STATUS)
    {
      gearman_client_do_status(&client, &numerator, &denominator);
      printf("Status: %u/%u\n", numerator, denominator);
    }
    else if (ret == GEARMAN_SUCCESS)
    {
      char result2[1024];
      strncpy(result2, result, result_size);
      result2[result_size] = 0;
      printf("result_size=%d,result=%s=\n", (int)result_size, result2);
      free(result);
    }
    else if (ret == GEARMAN_WORK_FAIL)
      fprintf(stderr, "Work failed\n");
    else if (ret == GEARMAN_TIMEOUT)
    {
      fprintf(stderr, "Work timeout\n");
    } else {
      fprintf(stderr, "%d,%s\n", gearman_client_errno(&client), gearman_client_error(&client));
    }
    printf("sleep 5s ...\n");
    sleep(5);
  }

  gearman_client_free(&client);

  return 0;
}

/*
  gearman worker 测试程序
  gcc -o jfy_worker jfy_worker2.c -I/usr/local/gearman/include -L/usr/local/gearman/lib -lgearman
  ./jfy_worker ./jfy_worker.tr
*/

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <libgearman/gearman.h>

static void *jfytest(gearman_job_st *job, void *context, size_t *result_size,
                     gearman_return_t *ret_ptr);

int main(int argc, char *argv[])
{
  gearman_return_t ret;
  gearman_worker_st worker;

  char *host = "localhost", *port = "4730";

  if (gearman_worker_create(&worker) == NULL)
  {
    printf("%s\n", gearman_worker_error(&worker));
    exit(1);
  }

  ret= gearman_worker_add_server(&worker, host, atoi(port));
  if (ret != GEARMAN_SUCCESS)
  {
    printf("%s\n", gearman_worker_error(&worker));
    exit(1);
  }

  ret= gearman_worker_add_function(&worker, "jfytest", 0, jfytest, NULL);
  if (ret != GEARMAN_SUCCESS)
  {
    printf("%s\n", gearman_worker_error(&worker));
    exit(1);
  }

  printf("wait job ...\n");
  while (1)
  {
    ret= gearman_worker_work(&worker);
    if (ret != GEARMAN_SUCCESS)
    {
      printf("%s\n", gearman_worker_error(&worker));
      break;
    }
  }

  gearman_worker_free(&worker);

  return 0;
}

static void *jfytest(gearman_job_st *job, void *context, size_t *result_size,
                     gearman_return_t *ret_ptr)
{
  const uint8_t *workload;
  char *request,*result;

  workload= gearman_job_workload(job);
  *result_size= gearman_job_workload_size(job);

  request= malloc(1024);
  if (result == NULL)
  {
    printf("malloc request:%d\n", errno);
    *ret_ptr= GEARMAN_WORK_FAIL;
    return NULL;
  }

  snprintf((char *)request, *result_size+1, "%s", (char *)workload);
  printf("job=%s,result_size=%d,request=%s\n", gearman_job_handle(job),*result_size,request);

  result= malloc(1024);
  if (result == NULL)
  {
    printf("malloc result:%d\n", errno);
    *ret_ptr= GEARMAN_WORK_FAIL;
    return NULL;
  }

  *ret_ptr= GEARMAN_SUCCESS;

  sprintf((char *)result, "%s->result", (char *)request);
  *result_size= strlen((char *)result);

  printf("job=%s,result_size=%d,result=%s\n", gearman_job_handle(job),*result_size,result);

  return result;
}


下面的实例是PHP程序(PHP Gearman参考文档),客户端发送"hello!"

worker端是两个程序,一个是阻塞方式的,一个是非阻塞方式的

<?php
/*
 * send "Hello!"
 */

echo "Starting\n";

# Create our client object.
$gmclient= new GearmanClient();

# Add default server (localhost).
$gmclient->addServer();

echo "Sending job\n";

# Send reverse job
do
{
  $result= $gmclient->do("reverse", "Hello!");
  # Check for various return packets and errors.
  switch($gmclient->returnCode())
  {
    case GEARMAN_WORK_DATA:
      echo "Data: $result\n";
      break;
    case GEARMAN_WORK_STATUS:
      list($numerator, $denominator)= $gmclient->doStatus();
      echo "Status: $numerator/$denominator complete\n";
      break;
    case GEARMAN_SUCCESS:
      break;
    default:
      echo "RET: " . $gmclient->returnCode() . "\n";
      exit;
  }
}
while($gmclient->returnCode() != GEARMAN_SUCCESS);
echo "Success: $result\n";

?>


<?php
/*
 * 阻塞方式Worker,处理"Hello!"转换为"!olleH"
 */

echo "Starting\n";

# Create our worker object.
$gmworker= new GearmanWorker();
$gmworker->setTimeout(5000);

# Add default server (localhost).
$gmworker->addServer();

# Register function "reverse" with the server. Change the worker function to
# "reverse_fn_fast" for a faster worker with no output.
$gmworker->addFunction("reverse", "reverse_fn");

print "Waiting for job...\n";
while($gmworker->work())
{
  if ($gmworker->returnCode() != GEARMAN_SUCCESS)
  {
    echo "return_code: " . $gmworker->returnCode() . "\n";
    break;
  }
  echo "receve and proced a job!";
}

function reverse_fn($job)
{
  echo "Received job: " . $job->handle() . "\n";

  $workload= $job->workload();
  $workload_size= $job->workloadSize();

  echo "Workload: $workload ($workload_size)\n";

  # This status loop is not needed, just showing how it works
  for ($x= 0; $x < $workload_size; $x++)
  {
    echo "Sending status: $x/$workload_size complete\n";
    /*
    $job->sendStatus($x, $workload_size);
    sleep(1);
    */
  }

  $result= strrev($workload);
  echo "Result: $result\n";

  # Return what we want to send back to the client.
  return $result;
}

# A much simpler and less verbose version of the above function would be:
function reverse_fn_fast($job)
{
  return strrev($job->workload());
}

?>

<?php
/*
 * 非阻塞方式Worker,处理"Hello!"转换为"!olleH"
 */

echo "Starting\n";

# Create our worker object.
$gmworker= new GearmanWorker();
$gmworker->setTimeout(1000);
$gmworker->addOptions(GEARMAN_WORKER_NON_BLOCKING); # Make the worker non-blocking

# Add default server (localhost).
$gmworker->addServer();

# Register function "reverse" with the server. Change the worker function to
# "reverse_fn_fast" for a faster worker with no output.
$gmworker->addFunction("reverse", "reverse_fn");

print "Waiting for job...\n";

while ( ($ret = $gmworker->work()) || $gmworker->returnCode() == GEARMAN_IO_WAIT || $gmworker->returnCode() == GEARMAN_NO_JOBS) {
  echo "return_code: " . $gmworker->returnCode() . "\n";
  if ($gmworker->returnCode() == GEARMAN_SUCCESS) {
    continue;
  }
  if ( !$gmworker->wait() ) {
    echo "return_code: " . $gmworker->returnCode() . "\n";
    if ($gmworker->returnCode() == GEARMAN_NO_ACTIVE_FDS) {
      # We are not connected to any servers, so wait a bit before
      # trying to reconnect. sleep(5);
      continue;
    }
    break;
  }
}

function reverse_fn($job)
{
  echo "Received job: " . $job->handle() . "\n";

  $workload= $job->workload();
  $workload_size= $job->workloadSize();

  echo "Workload: $workload ($workload_size)\n";

  # This status loop is not needed, just showing how it works
  for ($x= 0; $x < $workload_size; $x++)
  {
    echo "Sending status: $x/$workload_size complete\n";
    /*
    $job->sendStatus($x, $workload_size);
    sleep(1);
    */
  }

  $result= strrev($workload);
  echo "Result: $result\n";

  # Return what we want to send back to the client.
  return $result;
}

# A much simpler and less verbose version of the above function would be:
function reverse_fn_fast($job)
{
  return strrev($job->workload());
}

?>

零倾覆力矩点(ZMP) 从形式上讲,ZMP 指的是空间中相对于一个平面(通常是地平面)抵消接触力矩的点的集合。这个集合实际上是一个轴,而不是一个点,但为了方便起见,让我们按照传统的推导方法来计算地面平面上的 ZMP。这一推导从任何多刚体系统的牛顿-欧拉运动方程开始:其中,为机器人的总质量,为重力矢量,为系统的重心,为加速度,为固定点的角动量变化率。在右侧,表示净接触扭矩,即施加到机器人上的所有接触扭矩之和,坐标取自质心 (COM)。 阅读详情

相关推荐

潜在图神经网络学习笔记(Latent Graph Neural Networks for Human Skeleton-based Action Recognition)

在本文中,我们从一个新的角度来解决这个问题,通过将非结构化的骨架数据映射到潜在空间,如图2所示,这里称为潜在特征空间或嵌入空间,其中一组项嵌入在一个流形中[ 1 ],并且在潜在空间中彼此更相似的项被放置在彼此更接近的位置。潜在空间中的位置可以被认为是由一组潜在变量定义的,这些潜在变量来源于对象的相似性。将骨架数据嵌入到流形中,消除了远近邻居之间的冗余依赖关系,以解决加权问题。得到具有多尺度聚合特征的稀疏图矩阵结构,以更好地理解骨骼关节的直接加权信息。

qq_45631885的博客 488

gearman c语言,Gearman使用介绍 c语言0.2版本

怎样使用 Gearman?一个简单的gearman的体系包括三个部分,一个client,一个worker,一个jobserver,client负责创建并发起一个job请求,jobserver负责找到合适的worker,worker当然就是负责执行job,事实上是worker完成了实际的任务。gearman提供一个api从而你的client与worker能够与jobserver通信。我们来看一个简单...

weixin_42311335的博客 259

机器学习预测材料性能:从特征工程到SHAP可解释性分析

机器学习在材料科学中的应用,核心在于将复杂的材料性能预测问题转化为数据驱动的建模任务。其基本原理是通过算法从历史数据中学习特征与目标属性之间的映射关系。这项技术的价值在于能够大幅加速新材料的发现与设计周期,降低传统“试错法”的高昂成本。在工程实践中,它广泛应用于预测如形成能、带隙、弹性模量以及居里温度等关键材料性能。具体到磁性材料领域,居里温度的准确预测对于永磁体和自旋电子器件设计至关重要。本项目深入探讨了如何利用特征工程从材料成分与结构中构建有效描述符,并借助SHAP这一可解释性工具,揭示模型决策背后的物

weixin_27155667的博客 650

【迁移2015-09-01 15:56】 Gearman(一)

为什么80%的码农都做不了架构师?>>> ...

weixin_34281477的博客 220

USB2.0基础知识总结

目录 1、协议层: 1.1、域分类 1.2 、USB传输方式: 1、协议层: 域和包定义:包是一次传输的单位,每个包由多个域组成; USB中是按照LSB进行字节传输; 1.1、域分类 1.1.1: 同步域(SYNC field) 所有的包都开始于同步域,在低速和全速通信中SYNC field用7个0和1个1来表示。 由于USB2.0使用了NRZI编码(0用翻转来表示,1用不翻转表示),所以00000001就是上图那样。 ...

qq_32938605的博客 4408

暗黑破坏神2重制版 mod制作教程(一)

暗黑2重制版mod修改教程

hhhh2312的博客 7449

GearmanWorker的多进程实现

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34096182的博客 320

大疆上云API-1.10.0版本-设备位置数据实时处理与WebSocket推送实战解析

本文深入解析了大疆上云API 1.10.0版本中设备位置数据的实时处理与推送全链路。通过剖析源码,详细阐述了从MQTT接收OSD数据、Spring Integration路由分发、业务逻辑处理到WebSocket实时推送至前端地图的核心流程,并提供了实战优化与避坑指南,帮助开发者构建高可靠的无人机实时定位系统。

weixin_29291863的博客 412

[分享]Gearman - 分布式远程过程处理框架

【介绍】Gearman 是 Brad Fitzpatrick 的一个作品,用 Perl 写的任务调度程序,提供一个服务器端和多种语言的客户端接口,包括 C/Perl/Python/Ruby 等,在 client library 本身就支持一定程度的高可靠度。 Gearman系统用来把工作委派给其他机器,分布式的调用更适合做某项工作的机器,并发的做某项工作,在多个调用间做负载均衡,或用来

heiyeluren的blog(黑夜路人的开源世界) 6111

2025虚幻游戏逆向工程解包尝试

2025虚幻游戏逆向工程解包指南 本文详细介绍了虚幻引擎5游戏逆向解包的完整流程,主要包括获取AES密钥、生成映射文件和导出资源三个关键步骤。作者在实际操作中遇到诸多难题:AES密钥获取工具存在加壳保护问题,映射文件生成器依赖复杂的VS编译环境,DLL注入工具的使用也存在技术门槛。通过多次尝试,作者发现部分游戏可直接搜索现成的AES密钥,而映射文件生成需要额外下载Memcury依赖库才能正常编译。文章提供了相关工具的下载链接和具体操作说明,但同时也指出每个环节都可能出现意外状况,逆向工程实际执行过程远比理论

wsdchong的博客 6147

ParaView: 从 2 或 3 个标量创建向量

ParaView: 从 2 或 3 个标量创建向量

希望我的博客,能帮上你解决学习中工作中所遇到的问题 583

Gearman分布式任务处理系统(十)后记(持续更新)

整理中。。。

很多时候,你缺少的不是知识而是热情 3411

Multisim14.0仿真(五十九)基于74LS161的24进制计数器应用设计

它具有同步预置、异步清零功能,支持并行数据加载,并可在计数使能控制下进行二进制计数。:低电平时,在下一个时钟上升沿加载输入数据(A, B, C, D)。(多个 74LS161D 串联构成 8 位、12 位等更长计数器)。低电平时,下一个时钟上升沿加载输入数据(A, B, C, D)。:低电平有效,立即清零计数器(不受时钟控制)。均为高电平时,每个时钟上升沿计数。:两者均为高电平时,计数器才能递增。:立即清零计数器(不受时钟控制)。(通过预置初始值控制计数范围)。(计数范围:0 ~ 15,即。

corlin6688的博客 4758

利用 Gearman 实现系统错误报警功能

Gearman 是什么? Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。 Gearman 工作原理 Client(客户端):创建一个Job。 Server(服务):找到合适的Worker,把 Job 交给 Worker。 Work...

weixin_30855099的博客 138

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

官方的DEMO如下: ​http://gearman.info/libgearman/examples.html ​​ ​闲言少述,直接上源码: ​client ​ /*  * File:  *    simple-gearman-client.cpp  * Auth:  * Hank(hongkuiyan@yeah.net)  * Desc:  * Example

北雨南萍 1151

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Gearman GearmanClient 函数列表

GearmanWorker::__construct() 建立一个GearmanWorker实例来来连接job服务器并且接受可以运行的task来运行 GearmanWorker::addFunction() 向 job 服务器注册一个函数名称,并且根据函数指定回调函数,额外指定的程序数据将在超时后被调用 GearmanWorker::addOptions() 添加一个或者多个预先设定好的选项 Ge

gamelife1314的博客 614

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

用Gearman做队列来实现消息推送

前面有一篇文章,是Nginx+Lua来实现推送的方式,这里我们换一种作法,用Nginx+Gearman作队列来实现。 此方案的主要思路是这样的: 客户端不会频繁的轮询服务端,而是对服务端发起一个长连接,服务端通过阻塞方式读取Gearman队列数据,一旦发现新数据便给客户端发出响应,这次交互便结束了。客户端处理好新数据后再重新发起一个长连接,如此周而复始。 MySQL安装gearm

很多时候,你缺少的不是知识而是热情 4783

Gearman协议(翻译)

Gearman协议工作于TCP之上,默认使用4730端口。它之前使用端口7003,但与AFS的端口范围冲突,4730端口是由IANA分配的。client和jobserver间,以及worker与jobserver间存在通信交互,这两种情况下的通信协议都是由请求包和响应包组成。所有发送到jobserver的包都认为是请求,所有由jobserver发送的包都认为是响应。一种简单的配置例子是这样的:--

JenkinsLee的专栏 3603

Gearman今天突然出问题,Timeout occured when calling bind() for 0.0.0.0:4730

跟踪里,突然就出出这个错误 gearman起不来,4730监测不了 最好是停掉了所有和4730相关的进程,才起来 不知道怎么导致的?我还不知道原因,继续监控

很多时候,你缺少的不是知识而是热情 2228

[转载]Gearman(分布式任务调度框架) 简介

http://www.kuqin.com/system-analysis/20121209/333922.html 看到先记下来。回头试验下 在@hacker101的围脖上看到了这个框架,看了下官网,觉得很适合爬虫、多进程并行处理等任务。 看看官方提供的几个例子: Mass PDF quote email Synchronous Image Resize Shard-...

weixin_30918633的博客 222

gearman 在Kohana框架中通过minion运行GearmanWorker

背景: 一个kohana框架的工程,一段gearman worker的常驻程序。 由于这段程序与整个项目的业务有耦合,所以不能直接在terminal中用php+文件名的方式执行,这样执行仅仅是执行孤立的单个文件。 解决方法: 将这段程序携程kohana的controller/action形式,然后通过kohana的命令行方式执行。 参考 http://stackoverflow.

1051

Gearman-任务分发系统

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

zl 2710

Gearman Manager安装及碰到的问题

gearman manager安装的时候由于官方文档不太全,转了几大圈才搞定 现在记录下来 安装前需要php安装pecntl  php -m|grep pcntl 命令可查看 如果没有任何输出就是没安装 首先去官方https://github.com/brianlmoon/GearmanManager 把他下载下来,解压 进入目录install执行install.sh 会列出一个菜单让你选

蓝天的博客 671

gearman队列持久化引发的问题及解决方法

这篇文章主要介绍了gearman队列持久化引发的问题及解决方法,需要的朋友可以参考下 本文简述了gearman用mysql持久化的方法,以及由此引发的一些问题,具体分析如下: 一、gearman 创建Mysql持久化队列的方式如下: 1. 登入mysql命令行,运行:    create database gearman;   2. 启动gearman,命令如下: /usr/l

很多时候,你缺少的不是知识而是热情 2646

实现一个简单的服务端推送方案-实例篇Polling(服务端阻塞读)

前面讲过一篇《实现一个简单的服务端推方案-实例篇Polling》,那篇文章服务端的实现是不停的轮循数据库,这篇将服务器端轮循数据库改为服阻塞的方式读取队列,减轻数据库服务器的压力。 客户端代码,JS库为prototype.js: 无标题文档 var Class = { create: function() { return fun

很多时候,你缺少的不是知识而是热情 2180

用HTTP方式调用gearman任务处理

应用场景: 开启gearman http监听功能,让前端以web api方式调用gearman job 起用方式: 在gearmand的起动参数中加上: /usr/local/gearman/sbin/gearmand \ -l /usr/local/gearman/log/trace.log \ --verbose INFO -p 4730 -u root -d -t 4 \ --http-port=8080 \ -r http --

很多时候,你缺少的不是知识而是热情 3132
上一篇: Gearman分布式任务处理系统(七)问题研究与性能优化
下一篇: Gearman分布式任务处理系统(九)我的架构
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值