##language:zh <> = 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语言用户 === * 消费者例子 {{{ }}} == 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 <>