Browse Source

test 20_000, fix

221V 3 years ago
parent
commit
5f32619bd6

+ 55 - 33
README.md

@@ -69,39 +69,61 @@ tick: "10" 10
 tick: "12" 12
 tick: "13" 13
 
-(myapp@127.0.0.1)2> test:test2().
-add/update: "2" 2
-add/update: "4" 4
+
+% gen_server:cast add/delete
+(myapp@127.0.0.1)2> test:testn(300).
+40
+28
+29
+26
+34
+25
+31
+26
+21
+20
+24
+24
+30
+27
+30
+28
+34
+26
+28
+29
+27
+35
+28
+...
+ok
+
+
+% gen_server:call add/delete
+(myapp@127.0.0.1)3> test:testn_b(300).
+110
+111
+178
+136
+114
+108
+177
+141
+148
+109
+175
+177
+115
+177
+179
+178
+176
+178
+209
+187
+176
+140
+...
 ok
-add/update: "6" 6
-(myapp@127.0.0.1)3> add/update: "8" 8
-add/update: "10" 10
-add/update: "12" 12
-add/update: "14" 14
-add/update: "1" 1
-add/update: "3" 3
-add/update: "5" 5
-add/update: "7" 7
-add/update: "9" 9
-add/update: "11" 11
-add/update: "13" 13
-add/update: "15" 15
-add/update: "12" 12
-add/update: "13" 13
-deleted: "9" 9
-deleted: "14" 14
-tick: "1" 1
-tick: "3" 3
-tick: "5" 5
-tick: "2" 2
-tick: "7" 7
-tick: "4" 4
-tick: "11" 11
-tick: "6" 6
-tick: "8" 8
-tick: "10" 10
-tick: "15" 15
-tick: "12" 12
-tick: "13" 13
 ```
 

+ 2 - 1
apps/myapp/src/myapp_events.erl

@@ -72,6 +72,8 @@ handle_info(check_time_process, []) ->
   erlang:send_after(1000, self(), check_time_process),
   {noreply, []};
 handle_info(check_time_process, State) ->
+  erlang:send_after(1000, self(), check_time_process),
+  
   Timestamp_Now = erlang:system_time(second),
   State2 = lists:filtermap(fun({Task_Id0, Proc_Id0, Time0}=V) ->
     if Time0 =< Timestamp_Now ->
@@ -82,7 +84,6 @@ handle_info(check_time_process, State) ->
     end
     end, State),
   
-  erlang:send_after(1000, self(), check_time_process),
   {noreply, State2};
 
 

+ 39 - 9
apps/myapp/src/myapp_events2.erl

@@ -5,6 +5,7 @@
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
 
 -export([add_task/4, delete_task/2]).
+-export([add_task_b/4, delete_task_b/2]).
 
 
 -define(IS_STRING(S), (is_list(S) andalso S /= [] andalso is_integer(hd(S)))).
@@ -28,6 +29,24 @@ when ?IS_STRING(Task_Id), is_integer(Proc_Id) ->
   ok.
 
 
+add_task_b(Task_Id, Proc_Id, Type, Time)
+when ?IS_STRING(Task_Id), is_integer(Proc_Id), ((Type =:= static) orelse (Type =:= dynamic)), is_integer(Time) ->
+  Time2 = case Type of
+    dynamic ->
+      erlang:system_time(second) + Time; % Timestamp_Now + Time
+    _ ->
+      % static
+      Time
+  end,
+  gen_server:call(?MODULE, {add_task, {{Task_Id, Proc_Id}, Time2}}).
+
+delete_task_b(Task_Id, Proc_Id)
+when ?IS_STRING(Task_Id), is_integer(Proc_Id) ->
+  gen_server:call(?MODULE, {delete_task, {Task_Id, Proc_Id}}).
+
+
+
+
 start_link() ->
   gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
 
@@ -39,19 +58,31 @@ init([]) ->
   {ok, State}.
 
 
+handle_call({add_task, {{_Task_Id, _Proc_Id}, _Time}=V}, _From, State) ->
+  true = ets:insert(events_table, V),
+  %io:format("add/update: ~p ~p~n", [Task_Id, Proc_Id]),
+  {reply, ok, State};
+
+
+handle_call({delete_task, {_Task_Id, _Proc_Id}=V}, _From, State) ->
+  true = ets:delete(events_table, V),
+  %io:format("deleted: ~p ~p~n", [Task_Id, Proc_Id]),
+  {reply, ok, State};
+
+
 handle_call(_Req, _From, State) ->
   {reply, not_handled, State}.
 
 
-handle_cast({add_task, {{Task_Id, Proc_Id}, _Time}=V}, State) ->
+handle_cast({add_task, {{_Task_Id, _Proc_Id}, _Time}=V}, State) ->
   ets:insert(events_table, V),
-  io:format("add/update: ~p ~p~n", [Task_Id, Proc_Id]),
+  %io:format("add/update: ~p ~p~n", [Task_Id, Proc_Id]),
   {noreply, State};
 
 
-handle_cast({delete_task, {Task_Id, Proc_Id}=V}, State) ->
+handle_cast({delete_task, {_Task_Id, _Proc_Id}=V}, State) ->
   ets:delete(events_table, V),
-  io:format("deleted: ~p ~p~n", [Task_Id, Proc_Id]),
+  %io:format("deleted: ~p ~p~n", [Task_Id, Proc_Id]),
   {noreply, State};
 
 
@@ -59,10 +90,9 @@ handle_cast(_Req, State) ->
   {noreply, State}.
 
 
-%handle_info(check_time_process, []) ->
-%  erlang:send_after(1000, self(), check_time_process),
-%  {noreply, []};
 handle_info(check_time_process, State) ->
+  erlang:send_after(1000, self(), check_time_process),
+  
   Timestamp_Now = erlang:system_time(second),
   
   %ets:fun2ms(fun({{A,B},C}) when C =< Timestamp_Now -> {{A,B},C} end).
@@ -73,11 +103,11 @@ handle_info(check_time_process, State) ->
   lists:foldl(fun({{Task_Id0, Proc_Id0}=V, _Time0}, ok) ->
      % send_to_rabbitmq({call_timer, Proc_Id0, Task_Id0}),
      ets:delete(events_table, V),
-     io:format("tick: ~p ~p~n", [Task_Id0, Proc_Id0]),
+     %io:format("tick: ~p ~p~n", [Task_Id0, Proc_Id0]),
      ok
     end, ok, L),
   
-  erlang:send_after(1000, self(), check_time_process),
+  %erlang:send_after(1000, self(), check_time_process),
   {noreply, State};
 
 

+ 7 - 3
apps/myapp/src/myapp_events3.erl

@@ -41,7 +41,8 @@ start_link() ->
 
 
 init([]) ->
-  erlang:send_after(10, self(), load_data_from_db),
+  %erlang:send_after(10, self(), load_data_from_db),
+  self() ! load_data_from_db,
   State = [],
   {ok, State}.
 
@@ -80,11 +81,14 @@ handle_info(check_time_process, State) ->
      ok
     end, ok, L),
   
-  erlang:send_after(10, self(), check_time_process),
+  %erlang:send_after(10, self(), check_time_process),
+  %self() ! load_data_from_db,
   {noreply, State};
 
 
 handle_info(load_data_from_db, State) ->
+  erlang:send_after(1000, self(), load_data_from_db),
+  
   %ets:fun2ms(fun({{A,B},C}) -> true end).
   %[{{{'$1','$2'},'$3'},[],[true]}]
   
@@ -107,7 +111,7 @@ handle_info(load_data_from_db, State) ->
   
   %erlang:send_after(10, self(), check_time_process),
   self() ! check_time_process,
-  erlang:send_after(1000, self(), load_data_from_db),
+  %erlang:send_after(1000, self(), load_data_from_db),
   {noreply, State};
 
 

+ 49 - 1
apps/myapp/src/test.erl

@@ -1,6 +1,8 @@
 -module(test).
 
--export([test/0, test2/0]).
+-export([test/0, test2/0,
+  testn/1, testn_b/1]).
+
 
 test() ->
   Timestamp_Now = erlang:system_time(second),
@@ -44,4 +46,50 @@ test2() ->
   ok.
 
 
+testn(0) -> ok;
+testn(T) -> % T -- умовно секунди - кількість циклів по 20_000 нових заявок та 20_000 видалень
+  spawn(fun() ->
+    T1 = erlang:system_time(millisecond),
+    testn_h(T rem 2 =:= 0),
+    T2 = erlang:system_time(millisecond),
+    io:format("~p~n",[T2 - T1]),
+    ok
+  end),
+  
+  %timer:sleep(1000),
+  timer:sleep(900),
+  testn(T - 1).
+
+testn_h(true) ->
+  [myapp_events2:add_task(integer_to_list(X), X, dynamic, X + 1) || X <- lists:seq(1, 20_000)],
+  ok;
+testn_h(_) ->
+  Timestamp_Now = erlang:system_time(second),
+  [myapp_events2:add_task(integer_to_list(X), X, static, Timestamp_Now + 1) || X <- lists:seq(20_001, 40_000)],
+  ok.
+
+
+testn_b(0) -> ok;
+testn_b(T) -> % T -- умовно секунди - кількість циклів по 20_000 нових заявок та 20_000 видалень
+  spawn(fun() ->
+    T1 = erlang:system_time(millisecond),
+    testn_h2(T rem 2 =:= 0),
+    T2 = erlang:system_time(millisecond),
+    io:format("~p~n",[T2 - T1]),
+    ok
+  end),
+  
+  %timer:sleep(1000),
+  timer:sleep(900),
+  testn_b(T - 1).
+
+testn_h2(true) ->
+  [myapp_events2:add_task_b(integer_to_list(X), X, dynamic, X + 1) || X <- lists:seq(1, 20_000)],
+  ok;
+testn_h2(_) ->
+  Timestamp_Now = erlang:system_time(second),
+  [myapp_events2:add_task_b(integer_to_list(X), X, static, Timestamp_Now + 1) || X <- lists:seq(20_001, 40_000)],
+  ok.
+
+