标签:des cWeb cPage style blog http color io os
%%遍历表并回写数据 %%do_update_data/2里面做了ets:instert/2更新的操作和其它处理 handle_call({update_data,Request}, _From, State) -> [begin do_update_data(Item,Request)end|| Item<-ets:tab2list(?TABLE_NAME)], {reply, ok, State};
handle_call({update_data,Func}, _From, State) -> ets:safe_fixtable(?TABLE_NAME, true), update_data(ets:first(?TABLE_NAME), Func), ets:safe_fixtable(?TABLE_NAME, false), {reply, ok, State}. update_data(‘$end_of_table‘,_) -> ok; update_data({key, Value1, Value2, _, _, _}=Idx,Func) when Value1 == "test"; value1 == ‘_‘ -> case ets:lookup(?TABLE_NAME, Idx) of [Ele] -> Func(Ele); [] -> ok end, update_data(ets:next(?TABLE_NAME, Idx),Func); update_data(Idx,Func) -> update_data(ets:next(?TABLE_NAME, Idx), Func).
锁定一个类型是 set,bag 或 duplicate_bag 的表,使其可以安全遍历表里的数据;
在一个进程里调用 ets:safe_fixtable(Tab, true) 可以锁定一个表,直到在进程里调用 ets:safe_fixtable(Tab, false) 才会解锁,或进程崩溃。
如果同时有几个进程锁定一个表,那么表会一直保持锁定状态,直到所有进程都释放它(或崩溃)。有一个引用计数器记录着每个进程的操作,有 N 个持续的锁定操作必须有 N 个释放操作,表才会真正被释放。
handle_call({update_data,Func}, _From, State) -> ets:safe_fixtable(?TABLE_NAME, true), update_data(ets:first(?TABLE_NAME), Func,0), ets:safe_fixtable(?TABLE_NAME, false), {reply, ok, State}. update_data(‘$end_of_table‘,_,_) -> ok; update_data({key, Value1, Value2, _, _, _}=Idx,Func,Counter) when Value1 == "test"; value1 == ‘_‘ -> case ets:lookup(?TABLE_NAME, Idx) of [Ele] -> Func(Ele); [] -> ok end, NewCounter = if Counter >=50 -> timer:sleep(10),1; true -> Counter+1 end, update_data(ets:next(?TABLE_NAME, Idx),Func,NewCounter); update_data(Idx,Func,Counter) -> update_data(ets:next(?TABLE_NAME, Idx), Func,Counter).
[Erlang_Question23]怎么有效的遍历ETS表?
标签:des cWeb cPage style blog http color io os
原文地址:http://www.cnblogs.com/zhongwencool/p/erlang_ets.html