network_copool
简介
管理用于处理网络消息的协程池对象
组件接口
NetworkCo.gs
提供处理网络消息的独立协程的对象
函数原型 | 函数作用 |
---|---|
bool is_network_co() | 是NetworkCo的实例 |
void dispatch(mixed msg) | 发送消息到协程对象的消息队列中 |
coroutine get_co() | 获取本对象的消息处理协程 |
NetworkCoPool.gs
处理网络消息的协程池对象
函数原型 | 函数作用 |
---|---|
string get_name() | 获取协程池名字 |
void set_cache_size(int cache_size) | 设置缓存池大小 |
object new_co(function entry_func) | 从池子中借用一个协程对象,如果池子为空,则新创建一个 |
void delete_co(object ob) | 向池子归还一个协程对象,如果池子满了,则将对象销毁 |
void fix() | 维护接口,当池子内协程数量超过上限时(异常的并发导致)将销毁多余的协程对象 |
network_copool.gs
函数原型 | 函数作用 |
---|---|
object create_pool(string name, map para) | 创建一个处理网络消息的协程池对象 |
void destroy_pool(string name) | 销毁指定名称的协程池 |
object new_co(string name, function handle_func) | 在指定名称的协程池里申请一个用于网络消息处理协程对象 |
void delete_co(string name, object co) | 删除指定名称的协程池中的指定协程对象 |
object get_pool_ob(string name) | 获取指定名称的协程池对象 |
void add_pool_ob(object pool_ob) | 添加一个协程池对象到协程池表 |
void remove_pool_ob(object pool_ob) | 从协程池表中移除一个协程池对象 |
类
NetworkCoWorker
网络处理协程class
成员变量
变量名 | 类型 | 初始值 | 须初始化 | 描述 |
---|---|---|---|---|
q | queue | nil | 可选 | 消息队列 |
entry_func | function | nil | 可选 | 消息处理函数 |
semaphore | sync_object | nil | 可选 | 信号量 |
closed | bool | false | 可选 | 退出标记 |
co | coroutine | nil | 可选 | 处理协程 |
owner_id | int | -1 | 可选 | 本实例的所有者id(调试用) |
wait_warn_time | float | 0 | 可选 | 处理等待警告时长 |
execute_warn_time | float | 0 | 可选 | 执行等待警告时长 |
成员方法
函数原型 | 函数作用 |
---|---|
string desc() | 描述字符串 |
void set_entry_func(function fn) | 设置消息处理函数 |
void bind_queue(queue q) | 绑定新的消息队列 |
void send(mixed value) | 发送数据 |
mixed receive() | 接收数据 |
样例
import pkg.network_copool;
public void test()
{
string name = "test";
// 创建一个协程池
object pool_ob = network_copool.create_pool(name, {
"cache_size" : 32,
"wait_warn_time" : 5f,
"execute_warn_time" : 3f
});
defer {
network_copool.destroy_pool(name);
}
sync_object semaphore = sync_object.create_semaphore();
// 申请一个协程对象
object co = network_copool.new_co("test", (: process_one :));
int N = 100;
for (int i = 1 upto N)
{
// 模拟消息
function func = parallel () {
printf("number = %d\n", i);
semaphore.give();
};
co.dispatch(func);
}
for (int i = 1 upto N)
semaphore.take();
// 归还 协程对象
network_copool.delete_co(name, co);
}
parallel void process_one(function func)
{
func.call();
}