【问题标题】:Callbacks are not getting called when using concurrent tasks in gearman在 gearman 中使用并发任务时不会调用回调
【发布时间】:2012-06-29 13:31:30
【问题描述】:

我确实检查了以 reverse_worker 作为工作人员的示例 reverse_client_cb。 Worker 被调用并被执行,但没有一个回调(完成、失败等)在客户端被调用。

下面是我写的一个示例工作者和客户端,用于检查相同但相同的问题。 是否需要在 gearman 或 worker 和客户端的执行方式中进行任何配置?

sampleworker.cc

void* myfunc(gearman_job_st *job, void *data,size_t *size,gearman_return_t *ret)
{
    printf("\nmyfunc called\n");

    *ret=GEARMAN_SUCCESS;
    char *result=(char*)calloc(30,sizeof(char));
    strcpy(result,"work completed");
    *size=30;
    return result;
}

int main(int args,char* argv[])
{
   gearman_worker_st worker;

   gearman_worker_create(&worker);
   gearman_worker_add_server(&worker,"localhost",0);

   gearman_return_t ret =     gearman_worker_add_function(&worker,"sample",0,myfunc,NULL);

   while(1) gearman_worker_work(&worker);

   gearman_worker_free(&worker);
   return 0;
}

sampleclient.cc

static gearman_return_t complete(gearman_task_st *task)
{
     printf("Completed: %s %.*s\n", gearman_task_job_handle(task),
     (int)gearman_task_data_size(task), (char *)gearman_task_data(task));
     return GEARMAN_SUCCESS;
}

static gearman_return_t fail(gearman_task_st *task)
{
    printf("Failed: %s\n", gearman_task_job_handle(task));
    return GEARMAN_SUCCESS;
}

 int main(int args,char* argv[])
{
        gearman_client_st client;
    gearman_return_t ret;

    gearman_client_create(&client);
    gearman_client_add_server(&client,"localhost",0);

    gearman_task_st task,*task2;
    gearman_client_add_task(&client,&task,NULL,"sample",NULL,argv[1],(size_t)strlen(argv[1]),&ret);

    gearman_client_set_complete_fn(&client, &complete);
    gearman_client_set_fail_fn(&client, &fail);

    gearman_client_run_tasks(&client);  

    gearman_client_free(&client);
    return 0;
  }

用法

./sampleworker
./sampleclient Hello

“myfunc called”被打印出来,客户端也在等待工作人员完成工作。但是没有从完整或失败的功能中打印出来

【问题讨论】:

    标签: concurrency task gearman


    【解决方案1】:

    知道了。

    我删除了以下已安装的库,现在我得到了所有回调。

    libgearman-client-async-perl - gearman 分布式作业系统的异步客户端

    libgearman-client-perl - gearman 分布式作业系统的客户端。

    【讨论】:

      【解决方案2】:

      在我看来。你在函数调用顺序上犯了一些错误。

      gearman_client_set_complete_fn(&client, &complete);
      gearman_client_set_fail_fn(&client, &fail);
      

      //该函数必须在set_complete_fn之后调用

      gearman_client_add_task 
      gearman_client_run_tasks(&client); 
      

      【讨论】:

        猜你喜欢
        • 2019-03-25
        • 1970-01-01
        • 1970-01-01
        • 2014-05-05
        • 2020-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-28
        相关资源
        最近更新 更多