[PYTHON] Affichage en temps réel de la progression du traitement côté serveur sur le navigateur (implémentation de la barre de progression)

Aperçu

La description

Le titre peut être suspect et difficile à comprendre, mais en termes simples, il s'agit d'une implémentation d'une fonction qui affiche la progression du traitement par lots effectué côté serveur en temps réel sous la forme d'une barre de progression. En ce qui concerne la méthode, il semble qu'il existe différentes méthodes, mais parmi elles, il n'y avait pas de méthode d'implémentation comme moi cette fois, donc je la posterai pour le moment.

Flux de processus

--Browser: ** Entrée de paramètre ** (Langue: php) --Serveur:

la mise en oeuvre

Browser: partie d'entrée des paramètres

Cette fois, j'avais besoin de saisir l'ISBN du produit, alors saisissez le numéro ISBN et envoyez-le au serveur sous forme de courrier.

convert.php


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Convert WAV File!</title>
</head>
<body>
<form action="result.php" method="post">
  <p><label>ISBN (Numeric Only) : <input type="number" name="isbn"></label></p>
  <p><input type="submit" value="Submit"></p>
</form>
</body>
</html>

Serveur: partie de script de gestion

Côté serveur, selon les paramètres obtenus du côté navigateur, il est nécessaire d'effectuer un traitement par lots et en même temps d'exécuter un script de surveillance pour appréhender la situation. Par conséquent, deux scripts, le traitement par lots et la surveillance, seront lancés en parallèle.

Remarque: Lorsque le traitement par lots est terminé, afin de mettre fin au script de surveillance, l'état du traitement par lots est notifié en transmettant l'ID du processus de traitement par lots au script de surveillance.

process.py


#! /usr/bin/env python3
# -*- coding: utf-8 -*-
 
import os, sys, subprocess, shlex
from multiprocessing import Pool, Process, Queue

def f(logPID, q, scriptName, isbn):
	q.put([os.getpid()])
	os.system("sh "+scriptName+".sh "+logPID + " " + isbn)

def main():
	jobs = []
	q = Queue()

	isbn = sys.argv[1] 
	
	#Partie de traitement par lots
	mainJob = Process(target=f, args=("",q,"test", isbn, ))
	jobs.append(mainJob)
	mainJob.start()

	logPID = str(q.get()[0])
        
	#Partie surveillance
	monitorJob = Process(target=f, args=(logPID,q,"monitor", "", ))
	jobs.append(monitorJob)
	monitorJob.start()
		
	for job in jobs:
		job.join()

main()

Serveur: traitement par lots

À l'origine, le but de ce programme est d'effectuer un traitement par lots basé sur les informations ISBN, mais cette fois, en tant que cas de test, nous le remplacerons par un script qui affiche la progression du traitement sous forme de valeur numérique à intervalles de temps réguliers.

test.sh


#!/bin/sh

isbn=$1

touch log.txt
for i in 1 2 3 4 5 6 7 8 9 10; do
   sleep 2
  echo $i >> log.txt
done

Serveur: processus de surveillance

Le script de surveillance utilise la commande `` tail '' pour récupérer et analyser les lignes ajoutées au fichier journal en temps réel. Cette fois, puisque l'état d'avancement est directement sorti sous forme de nombre dans le traitement par lots, aucun traitement n'est effectué, mais en réalité, puisque diverses informations sont mélangées dans le fichier journal ainsi que l'état d'avancement, seul l'état d'avancement est utilisé dans le script de surveillance. Un traitement pour extraire est nécessaire.

Remarque: en ajoutant l'ID du processus de traitement par lots à la commande `` tail '', il est possible de mettre fin au script de surveillance lorsque le traitement par lots est terminé.

monitor.sh


#!/bin/sh

pID=$1 #ID du processus de traitement par lots
tail -f -n 1 --pid=$pID log.txt | while read line
do 
  if [ -n "$line" ] ; then 
     echo $line
  fi
done

Serveur: affichage de la barre de progression

Acquiert les résultats de surveillance en temps réel et les affiche sur la barre de progression. Enfin, nous informerons l'administrateur par e-mail qu'il a été traité.

Remarque: utilisez la commande `` popen '' pour obtenir les résultats du traitement python en temps réel en php.

result.php


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>Progress Bar</title>
</head>
<body>
<!-- Progress bar holder -->
<div id="progress" style="width:500px;border:1px solid #ccc;"></div>
<!-- Progress information -->
<div id="information" style="width"></div>
<?php
$isbn = $_POST['isbn']; 
echo "ISBN: ".$isbn;
// Total processes
$total = 10;
// Loop through process
$cmd = "python /var/www/html/service/progressbar/process.py ".$isbn;
$proc = popen($cmd, 'r');
//rea one line of the last oparation, and do nothing
$i = (int) fread($proc, 4096);
while (!feof($proc)) {
    // Calculate the percentation
	$i = (int) fread($proc, 4096);
    $percent = intval($i/$total * 100)."%";    
	// Javascript for updating the progress bar and information
    echo '<script language="javascript">
    document.getElementById("progress").innerHTML="<div style=\"width:'.$percent.';background-color:#ddd;\">&nbsp;</div>";
    document.getElementById("information").innerHTML="'.$percent.' processed.";
    </script>';
	// Send output to browser immediately
    flush();
	// Sleep one second so we can see the delay
    sleep(1);
	
	if($percent=="100%")
		break;
}
// Tell user that the process is completed
    echo '<script language="javascript">
    document.getElementById("information").innerHTML="Process completed!";
    </script>';

//send mail when the process is over
    $to = "[email protected]";
    $subject = "Lot traité";
    $message = "Administrateur,\n Numéro d'article: 「".$isbn."Il a été traité.\n Merci.";
    $headers = 'From: [email protected]' . "\r\n";
    if(mail($to, $subject, $message, $headers))
        echo "Un e-mail de notification a été envoyé!";
    else
        echo "L'e-mail de notification n'a pas pu être envoyé.\n Veuillez informer directement l'administrateur du numéro d'article."
?>
</body>
</html>

Remarques

Le code source de ce programme peut également être obtenu à partir du lien ci-dessous. Implémentation de la barre de progression

Recommended Posts

Affichage en temps réel de la progression du traitement côté serveur sur le navigateur (implémentation de la barre de progression)
Rendre la progression de dd visible sur la barre de progression
Comment afficher la barre de progression (tqdm)
Django ~ Affichons-le sur le navigateur ~
Afficher Python 3 dans le navigateur avec MAMP
Je veux afficher la barre de progression
Afficher le résultat du traitement de la géométrie en Python
Celui qui affiche la barre de progression en Python
Je veux afficher la progression en Python!
Utilisez la barre de progression avec Click: (Facile à utiliser, améliore l'affichage des tâches qui prennent plus de 24 heures, notes lors de l'utilisation en traitement parallèle)
Lisez le fichier csv et affichez-le dans le navigateur
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
Que faire si la barre de progression n'est pas affichée dans tqdm de python
Un mémorandum sur la mise en œuvre des recommandations en Python
Comment afficher le maillage régional du Government Statistics Office (eStat) dans un navigateur Web
100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
Afficher les horaires du système de localisation des bus Morioka dans Pythonista
La fonction d'affichage d'image d'iTerm est pratique lors du traitement d'images.
Implémentation du tri rapide en Python
Une fonction qui mesure le temps de traitement d'une méthode en python
for, continue, break Expliquer le flux du traitement itératif dans Python3-Part 1
Python dans le navigateur: la recommandation de Brython
L'histoire de la participation à AtCoder
Implémentation de la fonction de connexion dans Django
Barre de progression en pop-up avec Python Kivy
Papier: Traitement intracérébral de la musique
Implémentation du jeu de vie en Python
Affichage de la forme d'onde audio en Python
L'histoire du "trou" dans le fichier
Implémentation du tri original en Python
Explication et implémentation du protocole XMPP utilisé dans Slack, HipChat et IRC
[Android] Afficher des images sur le Web dans la fenêtre info de Google Map
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Afficher le statut de l'infection COVID 19 au Japon avec Splunk (version GitHub)
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique