Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- window(15).
- max_reqs(10).
- page_size(5).
- total_pages(5).
- api([[[a,10],[b,11],[c,12],[d,13],[e,14]],
- [[f,15],[g,16],[h,16],[i,17],[j,18]],
- [[k,19],[l,20],[m,21],[n,22],[o,23]],
- [[p,24],[q,25],[r,26],[s,27],[t,28]],
- [[u,29],[v,30],[w,31],[x,32],[y,33]]]).
- elem(P,E,D) :-
- api_call_2(E,D,D0),
- assert(mydata(P,E,D0)).
- mt_elem_handler(_,E,_) :- page_size(E),!.
- mt_elem_handler(P,E,D) :-
- thread_create(elem(P,E,D),_),
- succ(E,E0),
- mt_elem_handler(P,E0,D).
- page(P) :-
- api_call_1(P,D),
- mt_elem_handler(P,0,D).
- mt_page_handler(P) :- total_pages(P),!.
- mt_page_handler(P) :-
- thread_create(page(P),_),
- succ(P,P0),
- flag(count,Count,Count+1),
- rate_limit,
- mt_page_handler(P0).
- main :-
- rate_limit_init,
- mt_page_handler(0).
- api_call_1(Page,Page_data) :-
- atomic_concat("Page: ",Page,Log),
- writeln(Log),sleep(2),api(Data),
- nth0(Page,Data,Page_data).
- api_call_2(Elem,Page_data,Elem_data) :-
- atomic_concat("Elem: ",Elem,Log),
- writeln(Log),
- sleep(2),
- nth0(Elem,Page_data,[_,Elem_data]).
- rate_limit :-
- window(Window),
- req_rate(Limit),
- get_flag(count,Count),
- get_flag(time,Time),
- get_time(Time0),
- T_diff is Time0-Time,
- (( T_diff >= Window
- ; Count >= Limit )
- -> Sleep is (Window+1)-T_diff,
- atomic_concat("RL: ",Sleep,Log),
- writeln(Log),
- sleep(Sleep),
- writeln("Resuming..."),
- get_time(Time1),
- flag(count,_,0),
- flag(time,_,Time1)
- ;
- writeln("RL Miss") ).
- rate_limit_init :-
- get_time(Time),
- set_flag(time,Time),
- set_flag(count,0),
- max_reqs(MR),
- page_size(PS),
- Rate is MR/(PS+1),
- floor(Rate,Limit),
- assert(req_rate(Limit)).
- :- dynamic mydata/3.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement