erlang任务分发
来源:互联网 发布:小米note网络制式指令 编辑:程序博客网 时间:2024/06/05 20:57
%% Author: Administrator
%% Created: 2011-12-12
%% Description: TODO: Add description to ipad_deal
-module(ipad_deal).
%%
%% Include files
%%
%%
%% Exported Functions
%%
-export([init/2, work_start/0]).
%%
%% API Functions
%%
init(Log_Path, Process_Num) ->
Process_List = create_process_loop(Process_Num),
Wild_File_Name = "impression_log*.gz",
Full_Wild_File_Name = filename:join([Log_Path, Wild_File_Name]),
Search_File_List = case filelib:wildcard(Full_Wild_File_Name) of
[] ->
[];
[_H|_T] = File_Name_List ->
File_Name_List;
_ ->
[]
end,
dispatcher_work(Process_List, Search_File_List).
%lists:foreach(fun deal_file/1, Search_File_List).
create_process_loop(Process_Num) ->
[ {erlang:spawn(?MODULE, work_start, []), idle} || _X <- lists:seq(0, Process_Num - 1) ].
dispatcher_work([], []) ->
io:format("All Files done!!!~n");
dispatcher_work([{Pid, idle} | T], []) ->
Pid ! {self(), stop},
dispatcher_work(T ++ [{Pid, working}], []);
dispatcher_work([{Pid, idle} | T], [File_Name | File_List]) ->
Pid ! {self(), File_Name},
dispatcher_work(T ++ [{Pid, working}], File_List);
dispatcher_work([{_Pid, working} | _T] = Process_List, File_List) ->
receive
{Work_Pid, idle} ->
Remain_Process_List = lists:keydelete(Work_Pid, 1, Process_List),
dispatcher_work([{Work_Pid, idle} | Remain_Process_List], File_List);
{Work_Pid, stop} ->
io:format("stop ~p~n", [Work_Pid]),
dispatcher_work(lists:keydelete(Work_Pid, 1, Process_List), File_List)
end.
work_start() ->
receive
{From, stop} ->
From ! {self(), stop},
erlang:exit(normal);
{From, File_Name} ->
deal_file(File_Name),
From ! {self(), idle}
end,
work_start().
deal_file(GFile_Name) ->
%io:format("~p,~p~n", [self(), GFile_Name]),
DFile_Name = filename:join(filename:dirname(GFile_Name), filename:basename(GFile_Name, ".gz")),
{ok, Src_Data} = file:read_file(GFile_Name),
Dest = zlib:gunzip(Src_Data),
L = re:split(Dest, "[;\n]"),
{ok, FD} = file:open(DFile_Name, [write, append]),
parse_data(L, FD).
%%
%% Local Functions
%%
parse_data([_H], FD) ->
file:close(FD);
parse_data([], FD) ->
file:close(FD);
parse_data([_H1, H2|T], FD) when H2 =:= <<"valid">> ->
parse_data(T, FD);
parse_data([H1, H2|T], FD) when H2 =:= <<"unvalid">> ->
case check_play_type(H1) of
true ->
S = <<H1/bits, <<";valid">>/bits>>,
file:write(FD, S);
_ ->
ok
end,
parse_data(T, FD);
parse_data([_H1, _H2|T], FD) ->
parse_data(T, FD).
check_play_type(Input_Data) ->
{_, {_, _, _, _, _, _, _, {playerinfo, _, _, PlayType}}, _, _, _, _} = cupidlog_pb:decode_impression(base64:decode(Input_Data)),
case PlayType of
"ipad" ->
true;
_ ->
%io:format("~p,~p, ~p~n", [?FILE, ?LINE, PlayType]),
false
end.
%% Created: 2011-12-12
%% Description: TODO: Add description to ipad_deal
-module(ipad_deal).
%%
%% Include files
%%
%%
%% Exported Functions
%%
-export([init/2, work_start/0]).
%%
%% API Functions
%%
init(Log_Path, Process_Num) ->
Process_List = create_process_loop(Process_Num),
Wild_File_Name = "impression_log*.gz",
Full_Wild_File_Name = filename:join([Log_Path, Wild_File_Name]),
Search_File_List = case filelib:wildcard(Full_Wild_File_Name) of
[] ->
[];
[_H|_T] = File_Name_List ->
File_Name_List;
_ ->
[]
end,
dispatcher_work(Process_List, Search_File_List).
%lists:foreach(fun deal_file/1, Search_File_List).
create_process_loop(Process_Num) ->
[ {erlang:spawn(?MODULE, work_start, []), idle} || _X <- lists:seq(0, Process_Num - 1) ].
dispatcher_work([], []) ->
io:format("All Files done!!!~n");
dispatcher_work([{Pid, idle} | T], []) ->
Pid ! {self(), stop},
dispatcher_work(T ++ [{Pid, working}], []);
dispatcher_work([{Pid, idle} | T], [File_Name | File_List]) ->
Pid ! {self(), File_Name},
dispatcher_work(T ++ [{Pid, working}], File_List);
dispatcher_work([{_Pid, working} | _T] = Process_List, File_List) ->
receive
{Work_Pid, idle} ->
Remain_Process_List = lists:keydelete(Work_Pid, 1, Process_List),
dispatcher_work([{Work_Pid, idle} | Remain_Process_List], File_List);
{Work_Pid, stop} ->
io:format("stop ~p~n", [Work_Pid]),
dispatcher_work(lists:keydelete(Work_Pid, 1, Process_List), File_List)
end.
work_start() ->
receive
{From, stop} ->
From ! {self(), stop},
erlang:exit(normal);
{From, File_Name} ->
deal_file(File_Name),
From ! {self(), idle}
end,
work_start().
deal_file(GFile_Name) ->
%io:format("~p,~p~n", [self(), GFile_Name]),
DFile_Name = filename:join(filename:dirname(GFile_Name), filename:basename(GFile_Name, ".gz")),
{ok, Src_Data} = file:read_file(GFile_Name),
Dest = zlib:gunzip(Src_Data),
L = re:split(Dest, "[;\n]"),
{ok, FD} = file:open(DFile_Name, [write, append]),
parse_data(L, FD).
%%
%% Local Functions
%%
parse_data([_H], FD) ->
file:close(FD);
parse_data([], FD) ->
file:close(FD);
parse_data([_H1, H2|T], FD) when H2 =:= <<"valid">> ->
parse_data(T, FD);
parse_data([H1, H2|T], FD) when H2 =:= <<"unvalid">> ->
case check_play_type(H1) of
true ->
S = <<H1/bits, <<";valid">>/bits>>,
file:write(FD, S);
_ ->
ok
end,
parse_data(T, FD);
parse_data([_H1, _H2|T], FD) ->
parse_data(T, FD).
check_play_type(Input_Data) ->
{_, {_, _, _, _, _, _, _, {playerinfo, _, _, PlayType}}, _, _, _, _} = cupidlog_pb:decode_impression(base64:decode(Input_Data)),
case PlayType of
"ipad" ->
true;
_ ->
%io:format("~p,~p, ~p~n", [?FILE, ?LINE, PlayType]),
false
end.
- erlang任务分发
- 任务分发系统gearman
- Celery 分发任务
- [iOS] GCD任务分发
- Gearman 分发任务处理
- 任务分发框架 gearmand
- Gearman-任务分发系统
- RabbitMQ任务分发
- 开发任务分发中的横向分发和纵向分发
- java 多线程实现任务分发
- gearman 一个任务分发系统
- java 多线程实现任务分发
- RabbitMQ之任务分发篇
- Erlang定时任务server (仿crontab语法)
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- Java多线程--让主线程等待所有子线程执行完毕代码
- Ubuntu安装Apache2
- Hook技术2 内存中修改模块开头代码为跳转语句
- 关于错误提示:could not find a part of path “X:\”的解决办法
- C/C++:构建你自己的插件框架
- erlang任务分发
- java struts中实现上传多张图片代码
- 电脑输入法图标不见了怎么办?
- Flex中Alert参数分析
- 美语教学(1)
- 腾讯即将推出人脸认证登录技术
- 文件替换脚本
- 辞职申请
- Spring Hadoop 1.0.0 M1发布