I am working on a Perl script which does some periodic processing based on file-system contents. The overall structure is like this:
# ... initialization...
while(1) {
# ... scan filesystem, perform actions depending on changes detected ...
sleep 5;
}
I would like to add the ability to input some data into this process by means of exposing an interface through HTTP. E.g. I would like to add an endpoint to skip the sleep, but also some means to input data that is processed in the next iteration. Additionally, I would like to be able to query some of the program's status through HTTP (i.e. a simple fork()
to run the webserver-part in a separate process is insufficient?)
So far I have already used the Dancer2
framework once but it has a start;
call that blocks and thus does not allow any other tasks (like my loop) to run. Additionally, I could of course move the code which is currently inside the loop to an endpoint exposed through Dancer2
but then I would need to call that periodically (though an external program?) which seems to be quite an obscure indirection compared to just having the webserver-part running in background.
Is it possible to unobtrusively (i.e. without blocking the program) add a REST-server capability to a Perl script? If yes: Which modules would be used for the purpose? If no: Should I really implement an external process to periodically invoke a certain endpoint or pursue a different solution altogether?
(I have tried to add a dancer2
tag, but could not do so due to insufficient reputation. Do not be mislead by this: I have so far only tried with Dancer2
not the Dancer
(v.1))
You could try to launch your processing loop in a background thread, before you run start;
.
See man perlthrtut
You probably want use threads::shared;
to declare some variables shared between the REST part and the background thread. Or use dedicated queues/event mechanisms.