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.

原创粉丝点击