Task Runner

Making task runner.

This page's making task runner example.

Tags: task runner

<!DOCTYPE html>
<html>
  <head>
    <title>Task Runner</title>
    <link rel="stylesheet" href="http://www.3daysofprogramming.com/playground/pg.css" type="text/css">
    <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL,Map,Set,Promise"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
    <script src="https://unpkg.com/eventemitter3@latest/umd/eventemitter3.min.js"></script>
    <script src="http://www.3daysofprogramming.com/playground/examples/resources/js/stats.js"></script>
    <style>
      /**
        * Create a position for the chart
        * on the page */
      #chart {
        width: 100%;
        height: 100%;
      }
    </style>
  </head>
  <body>
    <div id="container" class="main">
      <canvas id="chart"></canvas>
    </div>

    <div>
      <button id="enroll-essential">Enroll ESSENTIAL</button>
      <button id="enroll-critical">Enroll CRITICAL</button>
      <button id="enroll-normal">Enroll NORMAL</button>
      <button id="enroll-idle">Enroll IDLE</button>
      <button id="enroll-worker">Enroll Worker Task</button>
      <button id="enroll-abort">Enroll Aborted ESSENTIAL Task</button>
    </div>

    <div>
      <button id="terminate-essential">Terminate ESSENTIAL</button>
      <button id="terminate-critical">Terminate CRITICAL</button>
      <button id="terminate-normal">Terminate NORMAL</button>
      <button id="terminate-idle">Terminate IDLE</button>
      <button id="terminate-all">Terminate ALL</button>
    </div>
    <script>
      import {sleep} from "./utils/common";
      import {randomInt} from "../src/pg/utils/math";
      import {
        Task,
        TASK_PRIORITY, TASK_STATUS,
        TaskRunner,
        WorkerTask
      } from "./utils/task-runner";

      var chart;
      var taskRunner;

      function init() {
        var container = document.getElementById('container');
        var width = container.clientWidth;
        var height = container.clientHeight;

        var canvas = document.getElementById('chart');
        var ctx = canvas.getContext('2d');

        canvas.width = width;
        canvas.height = height;

        var chartUpdate = _.throttle(function () {
          chart.data.datasets[0].data = taskRunner.status.map(function (s) { return s.queue; });
          chart.update();
        }, 100);
        taskRunner = new TaskRunner();
        taskRunner.on('task:enroll', chartUpdate);
        taskRunner.on('task:process', chartUpdate);
        taskRunner.on('worker-task:process', chartUpdate);
        taskRunner.on('terminate:priority', chartUpdate);
        taskRunner.on('terminate:all', chartUpdate);

        chart = new Chart(ctx, {
          type: 'horizontalBar',
          data: {
            labels: ["ESSENTIAL", "CRITICAL", "NORMAL", "IDLE", "WORKER"],
            datasets: [{
              label: '# of tasks',
              data: taskRunner.status.map(function (s) { return s.queue; }),
              backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(75, 192, 192, 0.2)' ],
              borderColor: [
                'rgba(255,99,132,1)',
                'rgba(255, 206, 86, 1)',
                'rgba(54, 162, 235, 1)',
                'rgba(75, 192, 192, 1)' ],
              borderWidth: 1
            }]
          },
          options: {
            scales: {
              xAxes: [{
                ticks: {
                  beginAtZero: true
                }
              }]
            }
          }
        });

        Object.values(TASK_PRIORITY).forEach(function (p) {
          var button = document.getElementById(("enroll-" + (p.key.toLowerCase())));

          if (!button) {
            return;
          }

          button.addEventListener('click', function () {
            var promises = [];
            var size = randomInt(100, 500);
            for (var i = 0; i < size; i++) {
              promises.push(taskRunner.enroll(getTask(), p));
            }
            Promise.all(promises).then(function () { return console.log(((p.key) + " finished")); });
          });
        });

        Object.values(TASK_PRIORITY).forEach(function (p) {
          var button = document.getElementById(("terminate-" + (p.key.toLowerCase())));

          if (!button) {
            return;
          }

          button.addEventListener('click', function () {
            taskRunner.terminate(p);
          });
        });

        var button = document.getElementById('enroll-worker');
        button.addEventListener('click', function () {
          taskRunner.enroll(getWorkerTask()).then(function () { return console.log('worker finished'); });
        });

        button = document.getElementById('terminate-all');
        button.addEventListener('click', function () {
          taskRunner.terminateAll();
        });

        button = document.getElementById('enroll-abort');
        button.addEventListener('click', function () {
          var promises = [];
          var size = randomInt(500, 1000);
          for (var i = 0; i < size; i++) {
            var task = getTask();
            promises.push(taskRunner.enroll(task, TASK_PRIORITY.ESSENTIAL));
            task.status = TASK_STATUS.ABORT;
          }
          Promise.all(promises).then(function () { return console.log("Aborted finished"); });
        });

        function getTask() {
          return new Task(function () {
            sleep(randomInt(1, 4));
          });
        }

        function getWorkerTask() {
          return new WorkerTask(function (params, done) {
            var delay = 3000;
            var start = new Date().getTime();
            console.time('worker');
            while (new Date().getTime() < start + delay) { ; }
            console.timeEnd('worker');
            done();
          });
        }
      }

      init();

      window.DEBUG = {
        taskRunner: taskRunner
      };
    </script>
  </body>
</html>