Contents
roo共享队列使用手册
使用准备
下载: 请到项目首页 - 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到你的项目目录下。
修改核心参数:
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管理程序的运行不影响共享内存的使用,但会使过期共享区回收功能失效。
roo共享队列编程
roo共享队列遵循生产者-消费者模型,概念易于理解,编程简单:
生产者进程 roo 队列 消费者进程
-----------------------------------------------------------------------------------------------
1)调用xxxPush(请求队列, 内容) --> | | --> 2)调用 xxxPull(请求队列)
| | <-- 3)调用 xxxPush(响应队列)
4)调用xxxFetch(请求队列) <-- | |
一般只需要使用2~3函数即可完成任务。
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; }
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()
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?>
roo共享队列管理接口
你可以通过roo共享队列管理接口取代roo管理程序,自己管理roo共享队列。
附录
A.INI配置文件说明
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);
C.限制
-- samhoo 2004-09-01 08:31:11