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
|
:- module(prime_node, []).
:- use_module(library(redis_streams)).
:- use_module(library(redis)).
:- use_module(library(broadcast)).
:- use_module(library(main)).
:- use_module(library(statistics)).
:- use_module(common).
:- initialization(main,main).
main([Name]) :-
set_prolog_flag(toplevel_goal, prolog),
node(Name).
node(Name) :-
make_group,
catch_with_backtrace(
listen_primes(Name),
E,
print_message(error, E)).
listen_primes(Consumer) :-
thread_create(xlisten_group(test, primes, Consumer, [candidates],
[ block(0.1)
]),
_, [alias(Consumer), detached(true)]).
:- listen(redis_consume(candidates, Data, Context),
check_prime_string(Data, Context)).
check_prime_string(Data, Context) :-
N = Data.get(candidate),
T0= Data.get(time),
!,
call_time(is_prime(N), Dict, True),
get_time(T1),
T is T1-T0,
redis(test, rpush(Data.drain,
p(N,True,Context.consumer,Dict.cpu,T) as prolog)).
is_prime(1) :- !.
is_prime(2) :- !.
is_prime(N) :-
End is floor(sqrt(N)),
( between(2, End, I),
N mod I =:= 0
-> !, fail
; true
).
|