zoukankan      html  css  js  c++  java
  • gearman作业服务器的工作心得

      最近在做一个学习app的api工作,有些统计方面的mysql自然交给队列去处理,昨天一迁移数据库就发现有些试卷的信息 作业服务器没有收到,可能是因为试卷题目量大了的原因,导致gearman work堵住了,所以gearman 的日志没有生成,表示 它根本没有接受到任务.

      原来的代码是

      客户端:

    //用的do系列
    $client = new GearmanClient();
    $client->addServer();
    $client->doBackground("stat",json_encode(array('stat'=>$stat,'item_list'=>$item_detail)));//异步工作进程,返回处理work ID
    $client->do("stat",json_encode(array('stat'=>$stat,'item_list'=>$item_detail)));//同步工作进程,返回work函数的return值

      服务端:

    $worker = new GearmanWorker();
    $worker->addServer();
    
    // 接受客户端的stat任务派发,并把它传递给study_stat函数
    $worker->addFunction("stat","study_stat");
    
    // 无际循环运行,gearman内部已有处理,不会出现占用过高死掉的情况
    while ($worker->work());
    
    function study_stat($job) {
       $data = json_decode($job->workload(),true);
        //处理代码省略
    }

      平常运用下是没问题的,但是昨天开始就会出现没有接受到任务的情况.所以今天早上换成了队列,代码如下:

      客户端:

      

    $client = new GearmanClient();
    $client->addServer('127.0.0.1',4730);
    $client->addTaskBackground("stat",json_encode(array('stat'=>$stat,'item_list'=>$item_detail)));//异步队列
    $client->addTask("stat",json_encode(array('stat'=>$stat,'item_list'=>$item_detail)));//同步队列
    $client->runTasks();//运行队列中的任务,只是do系列不需要runTask()

       服务端:

      

    $worker= new GearmanWorker();
    $worker->addServer('127.0.0.1',4730);
    $worker->addFunction("stat",function (GearmanJob $job) {
      $data = json_decode($job->workload(),true);//接受传递的JSON  
      //处理代码省略
    }

      特意加上了服务器IP和端口,防止出错,然后测试了一遍,还没出现问题.以后使用gearman学到的新知识也会写在这.

  • 相关阅读:
    WinForm的Chart控件画条形图
    WinForm的Chart控件画折线图
    自定义控件
    左侧收缩菜单
    数组
    C#生成随机数的三种方法
    WinForm之GDI手动双缓冲技术
    WinForm之GDI画图步骤
    WinForm GDI编程:Graphics画布类
    翻译:《实用的Python编程》08_02_Logging
  • 原文地址:https://www.cnblogs.com/tudou1223/p/4353183.html
Copyright © 2011-2022 走看看