[PYTHON] Echtzeitanzeige des serverseitigen Verarbeitungsfortschritts im Browser (Implementierung des Fortschrittsbalkens)

Überblick

Erläuterung

Der Titel mag verdächtig und schwer zu verstehen sein, aber in einfachen Worten handelt es sich um eine Implementierung einer Funktion, die den Fortschritt der auf der Serverseite durchgeführten Stapelverarbeitung in Echtzeit in Form eines Fortschrittsbalkens anzeigt. Was die Methode betrifft, scheint es verschiedene Methoden zu geben, aber unter ihnen gab es diesmal keine Implementierungsmethode wie mich, daher werde ich sie vorerst veröffentlichen.

Prozessablauf

--Browser: ** Parametereingabe ** (Sprache: PHP) --Server:

Implementierung

Browser: Parametereingabeteil

Dieses Mal musste ich die ISBN des Produkts eingeben, also geben Sie die ISBN-Nummer ein und senden Sie sie in Form einer Post an den Server.

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>

Server: Verwaltungsskriptteil

Auf der Serverseite ist es erforderlich, die Stapelverarbeitung gemäß den von der Browserseite erhaltenen Parametern durchzuführen und gleichzeitig ein Überwachungsskript auszuführen, um die Situation gleichzeitig zu erfassen. Daher werden zwei Skripte, Stapelverarbeitung und Überwachung, parallel gestartet.

Hinweis: Wenn die Stapelverarbeitung abgeschlossen ist, wird zum Beenden des Überwachungsskripts der Stapelverarbeitungsstatus benachrichtigt, indem die ID des Stapelverarbeitungsprozesses an das Überwachungsskript übergeben wird.

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] 
	
	#Stapelverarbeitungsteil
	mainJob = Process(target=f, args=("",q,"test", isbn, ))
	jobs.append(mainJob)
	mainJob.start()

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

main()

Server: Stapelverarbeitung

Ursprünglich bestand der Zweck dieses Programms darin, eine Stapelverarbeitung basierend auf ISBN-Informationen durchzuführen. Dieses Mal werden wir sie jedoch als Testfall durch ein Skript ersetzen, das den Verarbeitungsfortschritt in regelmäßigen Zeitintervallen als numerischen Wert ausgibt.

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

Server: Überwachungsprozess

Das Überwachungsskript verwendet den Befehl `` `tail```, um die der Protokolldatei hinzugefügten Zeilen in Echtzeit abzurufen und zu analysieren. Dieses Mal wird keine Verarbeitung durchgeführt, da der Fortschrittsstatus direkt im Batch-Prozess als Zahl ausgegeben wird. In der Realität wird jedoch nur der Fortschrittsstatus im Überwachungsskript verwendet, da verschiedene Informationen in der Protokolldatei sowie der Fortschrittsstatus gemischt sind. Die Verarbeitung zum Extrahieren ist erforderlich.

Hinweis: Durch Hinzufügen der Stapelverarbeitungsprozess-ID zum Befehl `` `tail``` kann das Überwachungsskript beendet werden, wenn die Stapelverarbeitung abgeschlossen ist.

monitor.sh


#!/bin/sh

pID=$1 #ID des Stapelverarbeitungsprozesses
tail -f -n 1 --pid=$pID log.txt | while read line
do 
  if [ -n "$line" ] ; then 
     echo $line
  fi
done

Server: Anzeige des Fortschrittsbalkens

Erfasst Überwachungsergebnisse in Echtzeit und zeigt sie in der Fortschrittsanzeige an. Schließlich werden wir den Administrator per E-Mail benachrichtigen, dass es verarbeitet wurde.

Hinweis: Verwenden Sie den Befehl `` `popen```, um die Python-Verarbeitungsergebnisse in Echtzeit in PHP abzurufen.

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 = "Charge verarbeitet";
    $message = "Administrator,\n Artikelnummer: 「".$isbn."Es wurde verarbeitet.\n Danke.";
    $headers = 'From: [email protected]' . "\r\n";
    if(mail($to, $subject, $message, $headers))
        echo "Benachrichtigungsmail wurde gesendet!";
    else
        echo "Die Benachrichtigungs-E-Mail konnte nicht gesendet werden.\n Bitte informieren Sie den Administrator direkt über die Artikelnummer."
?>
</body>
</html>

Bemerkungen

Der Quellcode für dieses Programm kann auch über den folgenden Link abgerufen werden. Implementierung des Fortschrittsbalkens

Recommended Posts

Echtzeitanzeige des serverseitigen Verarbeitungsfortschritts im Browser (Implementierung des Fortschrittsbalkens)
Machen Sie den Fortschritt von dd in der Fortschrittsanzeige sichtbar
So zeigen Sie den Fortschrittsbalken an (tqdm)
Django ~ Lass es uns im Browser anzeigen ~
Zeigen Sie Python 3 im Browser mit MAMP an
Ich möchte den Fortschrittsbalken anzeigen
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Diejenige, die den Fortschrittsbalken in Python anzeigt
Ich möchte den Fortschritt in Python anzeigen!
Verwenden Sie den Fortschrittsbalken mit Klick: (Einfach zu bedienen, verbessern Sie die Anzeige von Aufgaben, die länger als 24 Stunden dauern, Notizen bei Verwendung in der Parallelverarbeitung)
Lesen Sie die CSV-Datei und zeigen Sie sie im Browser an
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Was tun, wenn der Fortschrittsbalken in tqdm von Python nicht angezeigt wird?
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Anzeigen des regionalen Netzes des Government Statistics Office (eStat) in einem Webbrowser
100 Sprachverarbeitung Knock-42: Anzeige der Phrase der betroffenen Person und der betroffenen Person
Zeigen Sie den Fahrplan des Morioka-Busortungssystems in Pythonista an
Die Bildanzeigefunktion von iTerm ist praktisch bei der Verarbeitung von Bildern.
Implementierung der schnellen Sortierung in Python
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
for, continue, break Erläutern Sie den Ablauf der iterativen Verarbeitung in Python3-Teil 1
Python im Browser: Brythons Empfehlung
Die Geschichte der Teilnahme an AtCoder
Implementierung der Login-Funktion in Django
Fortschrittsbalken im Popup mit Python Kivy
Papier: Intrazerebrale Verarbeitung von Musik
Implementierung eines Lebensspiels in Python
Audio-Wellenform-Anzeige in Python
Die Geschichte des "Lochs" in der Akte
Implementierung der ursprünglichen Sortierung in Python
Erläuterung und Implementierung des in Slack, HipChat und IRC verwendeten XMPP-Protokolls
[Android] Zeigen Sie Bilder im Web im infoWindow von Google Map an
Erhalten Sie eine Liste der Ergebnisse der Parallelverarbeitung in Python mit Starmap
Zeigen Sie den Status der COVID 19-Infektion in Japan mit Splunk an (GitHub-Version).
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen