-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheHttpBenchCommon.erl
More file actions
103 lines (75 loc) · 2.59 KB
/
eHttpBenchCommon.erl
File metadata and controls
103 lines (75 loc) · 2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
-module(eHttpBenchCommon).
-compile(export_all).
sleep(N) when N >= 0 ->
receive
after N -> ok
end.
waitWorkersDone(PPid,TotalRequestNum) ->
BeginTime = getTime(),
waitWorkers(PPid,TotalRequestNum,0,0),
EndTime = getTime(),
DurTime = (EndTime - BeginTime) / 1000000 ,
%%io:format("~p,~p ~n",[TotalRequestNum,DurTime]),
PageSpeed = TotalRequestNum / DurTime,
io:format("Speed: ~p pages/second. ~n",[PageSpeed]).
getTime() ->
{MegaSecs, Secs, Microsecs} = now(),
(MegaSecs * 1000000 + Secs)*1000000 + Microsecs.
waitWorkers(_PPid,0,OKNum,ErrorNum)->
DoneNum = OKNum + ErrorNum,
io:format("*** The requests(~p) are processed.~n", [DoneNum]),
io:format("*** All work is done!~n"),
io:format("*** OK Request(~p).~n", [OKNum]),
io:format("*** Error Request(~p).~n", [ErrorNum]);
%PPid !{all_work_done};
waitWorkers(PPid,TotalNum,OKNum,ErrorNum)->
DoneNum = OKNum + ErrorNum,
case DoneNum rem 1000 of
0 ->
io:format("*** The requests(~p) are processed.~n", [DoneNum]);
_Other ->
void
end,
receive
{one_req_done}->
waitWorkers(PPid,TotalNum-1,OKNum+1,ErrorNum);
{one_req_error}->
waitWorkers(PPid,TotalNum-1,OKNum,ErrorNum+1);
Other->
io:format("*** waitChild Invalid message: ~p~n", [Other]),
exit("receive invalid worker ack message")
end.
launchWorkers(_PPid, _Request, _Handler,CNum, 0, _RNum, _RemNum,Worker_list)->
io:format("All the clients(~p) forked, ready for work!~n", [CNum]),
io:format("Send go_work command to the workers!~n"),
lists:foreach( fun(Pid)-> Pid ! {go_work} end, Worker_list);
launchWorkers(PPid, Request, Handler,CNum, 1, RNum, RemNum,Worker_list)->
Pid = spawn(
fun () ->
receive
{go_work}->
work(PPid,Request,Handler,RNum+RemNum)
end
end
),
launchWorkers(PPid, Request, Handler, CNum, 0, RNum, RemNum,[Pid|Worker_list]);
launchWorkers(PPid, Request, Handler, CNum, RemainCNum , RNum, RemNum, Worker_list)->
Pid = spawn(
fun () ->
receive
{go_work}->
work(PPid,Request,Handler,RNum)
end
end
),
launchWorkers(PPid, Request, Handler, CNum, RemainCNum-1, RNum, RemNum,[Pid|Worker_list]).
work(_PPid,_Request,_Handler,0)->
void;
work(PPid,Request,Handler,RNum)->
case Handler(Request) of
ok ->
PPid ! {one_req_done} ;
error ->
PPid ! {one_req_error}
end,
work(PPid,Request,Handler,RNum-1).