I tried to start a few pengines locally (namely, 3 because that is the maximum default).
I have found out that, once the pengines exit (because their idle time has been reached), the “pengine count” stays at 3, so replacement pengines cannot be started.
Maybe I’m forgetting a cleanup manoeuver? Or maybe I shouldn’t set
at_exit (Update: No, tested, that’s not it).
Here is a test:
:- use_module(library(pengines)). :- use_module(library(settings)). attempt :- set_setting(pengine_sandbox:idle_limit, 3), % default is 5 mins, shorten to 2s setting(pengine_sandbox:slave_limit,Max), % check out the (trigger warning) slave limit format("One can create ~d server/slave pengines~n",Max), % create maximum engines length(PengineIds,Max), maplist( [PengineId]>>pengine_create( [ id(PengineId), at_exit(format('Adios!~n',)) ]), PengineIds ), maplist( [PengineId]>>format("Created Pengine: ~q~n",PengineId), PengineIds), % write out what we know about active threads format("Current threads~n",), forall( thread_property(ThreadId,id(NumThreadId)), format(" ~q ~q~n",[ThreadId,NumThreadId])), % wait for engines to exit due to exceeing their idle time aggregate_all(count, pengines:child(_,_), CountBefore), format("There are ~d pengines~n",CountBefore), sleep(5), % There will be 3 x "Adios" on the screen. aggregate_all(count, pengines:child(_,_), CountAfter), format("There are ~d pengines~n",CountAfter), % But now it's no longer possible to start a pengine... \+ pengine_create( [ id(PengineId), at_exit(format('Adios!~n',)) ]).
Running the above:
?- [attempt]. true. ?- attempt. One can create 3 server/slave pengines Created Pengine: '1e075589-33a0-4d7c-864b-834e1269d8ca' Created Pengine: '14250aa2-4979-449d-8ea4-30fb23ccf125' Created Pengine: 'b2e58c98-527d-4811-a4da-62b84ea93675' Current threads main 1 gc 2 '__thread_pool_manager' 3 <thread>(4,0x7f5b08025780) 4 <thread>(5,0x7f5b080260d0) 5 <thread>(6,0x7f5b0800a030) 6 There are 3 pengines Adios! Adios! Adios! There are 3 pengines ERROR: Not enough resources: max_pengines
So, all the pengines exited, however, the system still thinks there are “not enough resources”.
Additionally, at some point I got the weird situation where format/2 wouldn’t print and just failed. I suppose some mutex hadn’t been cleared. I was unable to reproduce that though. On the terminal:
?- format(""). true. ?- format("",). false. ?- help(format/2). true. ?- format("",). false. ?- format("",[a]). false.
The damnedest thing.