The library(http/thread_httpd.pl) provides the 
infrastructure to manage multiple clients using a pool of worker-threads. 
This realises a popular server design, also seen in Java Tomcat and 
Microsoft .NET. As a single persistent server process maintains 
communication to all clients startup time is not an important issue and 
the server can easily maintain state-information for all clients.
In addition to the functionality provided by the inetd server, the 
threaded server can also be used to realise an HTTPS server exploiting 
the library(ssl) library. See option ssl(+SSLOptions) 
below.
port(?Port) 
option to specify the port the server should listen to. If Port 
is unbound an arbitrary free port is selected and Port is 
unified to this port-number. The server consists of a small Prolog 
thread accepting new connection on Port and dispatching these 
to a pool of workers. Defined Options are:
infinite, 
a worker may wait forever on a client that doesn't complete its request. 
Default is 60 seconds.https:// protocol. SSL 
allows for encrypted communication to avoid others from tapping the wire 
as well as improved authentication of client and server. The SSLOptions 
option list is passed to ssl_context/3. 
The port option of the main option list is forwarded to the SSL layer. 
See the library(ssl) library for details.http or https.This can be used to tune the number of workers for performance. Another possible application is to reduce the pool to one worker to facilitate easier debugging.
pool(Pool) or to thread_create/3 
of the pool option is not present. If the dispatch module is used (see section 
3.2), spawning is normally specified as an option to the http_handler/3 
registration.
We recommend the use of thread pools. They allow registration of a set of threads using common characteristics, specify how many can be active and what to do if all threads are active. A typical application may define a small pool of threads with large stacks for computation intensive tasks, and a large pool of threads with small stacks to serve media. The declaration could be the one below, allowing for max 3 concurrent solvers and a maximum backlog of 5 and 30 tasks creating image thumbnails.
:- use_module(library(thread_pool)).
:- thread_pool_create(compute, 3,
                      [ local(20000), global(100000), trail(50000),
                        backlog(5)
                      ]).
:- thread_pool_create(media, 30,
                      [ local(100), global(100), trail(100),
                        backlog(100)
                      ]).
:- http_handler('/solve',     solve,     [spawn(compute)]).
:- http_handler('/thumbnail', thumbnail, [spawn(media)]).