跳到主要内容

global_ob

简介

基于pkg.ob_sync实现的全局对象

可以通过镜像对象和全局对象保持数据同步

组件接口

GlobalObBase.gs

全局对象、镜像对象的基础组件

函数原型函数作用
void auto_sync(float seconds)开始和全局对象同步
void stop_auto_sync()停止和全局对象同步
map query_entire_dbase()返回所有须同步的数据
mixed query(string key)查询须同步的数据
void set(mixed key, mixed val)设置须同步的数据
void delete(mixed key)删除须同步的数据
void raise(...)全局对象抛出一个事件
mixed query_temp(mixed key)查询无须同步的临时数据
void set_temp(mixed key, mixed val)设置无须同步的临时数据
void delete_temp(mixed key)删除无须同步的临时数据

GlobalObMaster.gs

全局对象

函数原型函数作用
object create_mirror(domain d)创建一个跟我同步的镜像对象
void remove_mirror(object mirror_ob)移除一个镜像对象

global_ob.gs

函数原型函数作用
object new_one(string name, map dbase = )创建一个全局对象
object find_one(string name)根据名称找一个全局对象
object new_mirror(string name, domain d = nil)从指定名字的全局对象本体创建一个镜像
void focus_on(string name, object follower, function fn)关注一个全局对象;全局对象数据发生变更时,将通知回调函数
void cancel_focus(string name, object follower)取消对指定全局对象的关注

样例

#pragma parallel

import gs.lang.*;
import gs.util.*;

import pkg.global_ob;

void create()
{
}

public void test()
{
// 创建一个名为"abc"的全局对象
map para = {
"j" : 1,
"k" : 2,
};
object ob = global_ob.new_one("abc", para);
defer ob.close();

sync_object sem = sync_object.create_semaphore();
defer sem.close();

// 创建一个"abc"的镜像,并且关注abc的数据变更
object m1 = global_ob.new_mirror("abc", domain.create());
defer m1.close();
m1=>auto_sync(0.1);
global_ob.focus_on("abc", m1, (: on_event, m1, sem :));

sem.take();
printf("j=%d\n", m1=>query("j"));
printf("k=%d\n", m1=>query("k"));

ob=>set("j", 10);
sem.take();
printf("j=%d\n", m1=>query("j"));

ob=>set("k", 20);
sem.take();
printf("k=%d\n", m1=>query("k"));
}

void on_event(object m1, sync_object sem, ...)
{
printf("master changed: %M\n", $<);
sem.give();
}