Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"

Providing feedback to Web GUI (Mojolicious)

by Endless (Beadle)
on Nov 16, 2013 at 11:51 UTC ( #1062880=perlquestion: print w/replies, xml ) Need Help??
Endless has asked for the wisdom of the Perl Monks concerning the following question:

Dear /(Wom|M)anly/ Monks,

I recently used Mojolicious and AJAX to create a GUI for a Perl system I use; it works wonderfully, and launches the process. Now I need some general strategy guidance: the process can take hours, sometimes a full day. I built it so that from the command line it prints progress as it goes ("Processed 1 million ... processed 2 million..."). What strategy and technologies can I use to provide a feedback function for the web app? I assume this will require multiple threads, something I have no knowledge about in Perl (and, from what I've heard, they can be scary).

I don't think a progress bar will be ideal; instead a status page would be better, simply stating progress so far, and perhaps average speed (all things I printed to the console before the web GUI). But I'm not sure where to start for an approach to this task.


  • Comment on Providing feedback to Web GUI (Mojolicious)

Replies are listed 'Best First'.
Re: Providing feedback to Web GUI (Mojolicious)
by LanX (Bishop) on Nov 16, 2013 at 12:31 UTC
    OK I dunno which techniques are the "Mojo" way to do it.

    But if you normally printed the status to STDOUT why don't you simply redirect it now to a file?

    You could use a scheduled AJAX request to poll the infos there without needing any threads on the server side.

    Tip: formatting in JSON might help with multiple data fields.

    Cheers Rolf

    ( addicted to the Perl Programming Language)

Re: Providing feedback to Web GUI (Mojolicious)
by ig (Vicar) on Nov 16, 2013 at 20:05 UTC

    An easy first step would be to prepare a simple status page and set it to refresh periodically (meta refresh). Next step would be to use a timer in your javascript and only refresh the status, rather than refresh the whole page, so the back button works as expected.

    This assumes your process records progress somewhere suitable for producing the status page. This could be to your application database, to a log file or whatever.

      running a process like this which takes a long time (especially a day or more!) from a web request is not really a good idea. It will be using one of the web request threads for all that time.

      A better solution would be to kick off a job elsewhere and release the web request thread. You can do this by putting a job on a job queue (have a look at beanstalk) then as soon as you have done this, return 'success' to the requesting web page. (success that you have scheduled the job).

      Then another process which is running as a client would take this job and process it. It can output it's current status and percentage done to a file. Another AJAX web request can interrogate that file and immediately return the job status.

      If you are only running one of these big jobs at a time then a single job queue client will suffice. If you want to run more in parallel then just run more clients.

      What is happening here is that each job client is running as a separate operating system process which means you don't have to worry about multi-threading.

      Not sure what mojo is or how useful this is to what you're working on, but SSE might be something to look into.
      #!/usr/bin/perl -- print "Content-Type: text/event-stream\n\n"; while(true){ print "event: server-time\n"; $num++; print "data: $num\n\n"; }
      generates an SSE stream.
      <!DOCTYPE HTML> <html> <head> <title>Server-Side Event</title> <script type="text/javascript"> function invokeSSE(){ var source = new EventSource('http://localhost/'); source.addEventListener('server-time', function(e) { document.getElementById('ticker').innerHTML = + '<br>'; }, false); source.addEventListener('open', function(e) { //Connection Open }, false); source.addEventListener('error', function(e) { if (e.readyState == EventSource.CLOSED) { alert("Connection closed"); } }, false); } </script> </head> <body onload="invokeSSE()"> <div id="ticker" name="ticker"> [TIME] </div> </body> </html>
      is a page to listen to SSE streams.
Re: Providing feedback to Web GUI (Mojolicious)
by Anonymous Monk on Nov 17, 2013 at 01:14 UTC
Re: Providing feedback to Web GUI (Mojolicious)
by taint (Chaplain) on Nov 16, 2013 at 19:53 UTC
    Greetings, Endless.

    While I haven't really looked into Mojo very deeply. I recently ran into a Module by Damian Conway : Smart::Comments

    If I understand you correctly, I think it just might hit the spot.

    It allows you to create "progress bars" in a flexible way. But is not limited to presenting feedback this way. It allows for some very creative ways of reporting states, or progress, at pretty much anytime.

    Best wishes.


    #!/usr/bin/perl -Tw
    use Perl::Always or die;
    my $perl_version = (5.12.5);
    print $perl_version;

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1062880]
Approved by LanX
Front-paged by LanX
[karlgoethebier]: No sack of rice fell over in China?
[karlgoethebier]: PM is going down...
[LanX]: ♪..♫ Don't cry for me Mandarina .......♩..♬
[karlgoethebier]: ...pasta bolded too soft in Eately?
[karlgoethebier]: BOILED!
[karlgoethebier]: OK, at least a cool song: https://www. v=jU4caMqKssg

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (6)
As of 2017-10-21 15:02 GMT
Find Nodes?
    Voting Booth?
    My fridge is mostly full of:

    Results (270 votes). Check out past polls.