1. roo共享队列使用手册

1.1. 使用准备

  • 下载: 请到项目首页 - SimpleShmProject下载.

  • 安装:

    • c语言用户: 拷贝libroo.so和roo.h到你的项目目录下(如:分别放在lib和include目录下),并设置LD_LIBRARY_PATH指向libroo.so所在的目录即可。

    • pythony用户:拷贝python/_roo.so 和python/roo.py你的项目目录下即可。

    • php用户:拷贝php_roo.so到php的extension目录下,拷贝roo.php到你的项目目录下。

  • 修改核心参数

1.2. roo管理程序

  • roo管理程序功能:
  • 实时监控队列情况(包括队列名称、大小...)。
  • 过期共享区回收(当申请的共享区超过预先设置的时间,而仍未处理时,管理程序将负责回收)
  • 产生测试数据,消费测试数据。
    Usage:   m|p|c [inifile] [pnum] [times] [kbytes]
    Example: ctest m shmq.ini   -  start the manager configured with file shmq.ini //以shmq.ini作为配置文件启动共享池管理程序
              ctest p 200 500 1  -  start the producer[200 process, 500 times, 1kbytes] //启动200个数据生产者(进程)、每个生产者重复50次,每次数据1k
             ctest c 3          -  start the consumer[3 process] //启动3个数据消费者(进程)
    

    注:roo管理程序只需启动一次,即可初始化配置文件的共享队列。停止roo管理程序的运行不影响共享内存的使用,但会使过期共享区回收功能失效。

1.3. roo共享队列编程

roo共享队列遵循生产者-消费者模型,概念易于理解,编程简单:

生产者进程                                   roo 队列                            消费者进程
-----------------------------------------------------------------------------------------------
1)调用xxxPush(请求队列, 内容)       -->      |              |       -->         2)调用 xxxPull(请求队列)
                                          |              |       <--         3)调用 xxxPush(响应队列)
4)调用xxxFetch(请求队列)            <--      |              |      

一般只需要使用2~3函数即可完成任务。

1.3.1. C语言用户

  • 请求发起者函数:
    int produce(int buffsize)
    {
        char s[512 * 1024];
        char s2[512 * 1024];
        char mypid[16];
        char buff[1024];
        char buff2[1024];
        unsigned long  sender;
    
        memset(s, 'X', buffsize);
        s[0] = '[';
        sprintf(mypid, "%08d", getpid());
        memcpy(s + 1, mypid, 8);
        s[buffsize - 1] = '\n';
        s[buffsize - 2] = ']';
    
        // put a message which anyone can access
        rooPush(ROO_REQT_POOL, s, buffsize, 0);
    
        // get a message which snd to me
        rooFetch(ROO_RESP_POOL, s2, sizeof(s2), &sender);
    
        return 0;
    }
    
    请求响应者函数:
    int consume()
    {
        char s[512 * 1024];
        unsigned long sender;
    
        if ( rooPull(ROO_REQT_POOL, s, sizeof(s), &sender ) == -1){
           printf("rooPull error!\n");
           return -1;
        }
    
        if ( rooPush(ROO_RESP_POOL, s, strlen(s) + 1, sender) < 0 ){
           printf("rooPush error!\n");
           return -1;
        }
        return 0;
    }
    

1.3.2. python语言用户

  • 消费者例子
    import roo
    
    def consume():
        #设置pull, popup, fetch函数为不阻塞模式
        roo.setTimeOut(roo.ROO_FUNCTYPE_READ, roo.ROO_NOHANG)
        size, msg, sender = roo.charPull(roo.ROO_REQT_POOL)
    
        print msg
        msg2 = msg + 'python changed!!!!'
        roo.charPush(roo.ROO_RESP_POOL, msg2, sender)
    
    for i in range(33334): 
        consume() 
    

1.3.3. php语言用户

  • 消费者例子
    <?php
    
    require_once('roo.php');
    
    $msg = "php generated.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEEE";
    print "push msg:$msg\n";
    
    charPush(ROO_REQT_POOL, $msg, 0);
    
    $ret = charFetch(ROO_RESP_POOL);
    
    print $ret;
    print "size = $ret[size]\n";
    print "message = $ret[message]\n";
    printf("sender = %u\n", $ret[sender]);
    
    php?>
    

1.4. roo共享队列管理接口

你可以通过roo共享队列管理接口取代roo管理程序,自己管理roo共享队列。

1.5. 附录

1.5.1. A.INI配置文件说明

1.5.2. B.API

  • void getProfile(rooProfile *profile);
    void setProfile(rooProfile *profile);
    
    int rooPush(char *PoolName, void *Buffer, int Size, unsigned long Receiver);
    int rooPull(char *PoolName, void *Buffer, int Size, unsigned long  *Sender);
    int rooPopup(char *PoolName, void *Buffer, int Size, unsigned long  *Sender);
    int rooFetch(char *PoolName, void *Buffer, int Size, unsigned long  *Sender);
    

1.5.3. C.限制


-- samhoo 2004-09-01 08:31:11