feat(worker): der externe Worker wird erwachsen - Log in Rippy, Anzeige, Slots
Ampel / ampel (push) Successful in 28s
Ampel / ampel (push) Successful in 28s
Commander 26.07.2026: "der externe Encoder Worker ist ein bisschen duenn - der koennte noch viel mehr." Drei Punkte, alle am Tray. 1. LOG IN RIPPY STATT TXT-DATEI (ausdruecklich gewuenscht). Das Tray schrieb sein Log nach %LOCALAPPDATA% und oeffnete es im Editor - wer wissen wollte, warum der Worker nichts tut, musste sich an den PC setzen. Neue Bruecke (logbruecke.py) meldet die wichtigen Zeilen nach Rippy, Quelle "w:<name>", und die Logs-Seite hat jetzt Knoepfe je Quelle: "was macht mein PC" ist ein Klick. Der Filter konnte Quellen schon immer, es gab nur keinen Knopf. Durchgelassen wird WENIG und mit Grund: Die Job-Meldungen stehen laengst in Rippy (tasks.py schreibt sie selbst). Es fehlte, was DANEBEN passiert und den Worker unbrauchbar macht, ohne dass ein Job existiert - hochgefahren oder nicht, Verbindung zu Redis/Postgres, Abstuerze. Alles andere fliegt weg: Celery ist bei --loglevel=info gespraechig, die logs-Tabelle hat keine Aufraeumung, und ein zugemuelltes Log ist so unbrauchbar wie keins. Dazu eine Drossel (30 Zeilen/Minute), die MELDET, wieviel sie verschluckt hat. Zeilenformat woertlich aus dem laufenden Container abgenommen (Celery 5.4.0). Die lokale Datei bleibt - sie ist genau dann die einzige Auskunft, wenn Rippy nicht erreichbar ist. 2. DAS TRAY ZEIGT, WAS LAEUFT. Vorher stand dort "laeuft" oder "gestoppt" - auf einer Maschine, die stundenlang an einem Film rechnet, ist das keine Auskunft. Jetzt Titel, Prozent und Restzeit, geholt von Rippys /jobs. Bewusst dieselbe Quelle wie das Dashboard, damit im Tray nicht eine zweite, abweichende Schaetzung steht. Dazu: Windows schlaeft nicht mehr mitten im Encode ein (SetThreadExecutionState, ohne ES_DISPLAY_REQUIRED - der Bildschirm darf ausgehen). Die Sperre wird zurueckgenommen, sobald nichts laeuft, und auch bei einem harten Ende des Trays - sonst schlaeft der PC nie wieder ein und niemand weiss warum. 3. MEHRERE ENCODES GLEICHZEITIG. Der Worker lief fest mit --pool=solo und nahm genau EINEN Auftrag an. Der Installer fragt die Zahl jetzt (GUI: Feld neben dem Namen, mit der erkannten Kernzahl daneben), Vorbelegung ab 12 Kernen zwei, sonst einer: HandBrake nutzt schon alle Kerne, aber x265 skaliert nicht linear. Auf Windows gibt es keinen prefork-Pool (kein fork) - deshalb --pool=threads, was hier passt, weil die Arbeit ein Kind-Prozess ist und der Thread nur wartet. GUI-Layout headless gerendert und angesehen (nichts ueberlappt, 16 Kerne korrekt erkannt), beide .ps1 mit echtem PowerShell 5.1 geprueft, BOM und CRLF erhalten, .exe neu gebaut. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -135,13 +135,43 @@ $form.Controls.Add($lblName)
|
||||
|
||||
$txtName = New-Object System.Windows.Forms.TextBox
|
||||
$txtName.Location = New-Object System.Drawing.Point(24, 196)
|
||||
$txtName.Size = New-Object System.Drawing.Size(300, 26)
|
||||
$txtName.Size = New-Object System.Drawing.Size(240, 26)
|
||||
$txtName.Text = $WorkerName
|
||||
$txtName.BackColor = $cFeld
|
||||
$txtName.ForeColor = $cText
|
||||
$txtName.BorderStyle = "FixedSingle"
|
||||
$form.Controls.Add($txtName)
|
||||
|
||||
# Gleichzeitige Auftraege (Commander 26.07.2026: "Mehrere Encodes gleichzeitig").
|
||||
# Vorher lief der Worker fest mit --pool=solo und nahm genau EINEN Auftrag an.
|
||||
# Vorbelegung nach Kernzahl: ab 12 Kernen zwei, sonst einer. Grund: HandBrake
|
||||
# nutzt schon alle Kerne, aber x265 skaliert nicht linear - auf einer breiten
|
||||
# CPU bringt ein zweiter Encode mehr Durchsatz, auf einer schmalen bremst er nur.
|
||||
$lblSlots = New-Object System.Windows.Forms.Label
|
||||
$lblSlots.Text = "Gleichzeitig:"
|
||||
$lblSlots.Location = New-Object System.Drawing.Point(280, 176)
|
||||
$lblSlots.Size = New-Object System.Drawing.Size(120, 18)
|
||||
$lblSlots.ForeColor = $cGedaempft
|
||||
$form.Controls.Add($lblSlots)
|
||||
|
||||
$numSlots = New-Object System.Windows.Forms.NumericUpDown
|
||||
$numSlots.Location = New-Object System.Drawing.Point(280, 196)
|
||||
$numSlots.Size = New-Object System.Drawing.Size(70, 26)
|
||||
$numSlots.Minimum = 1
|
||||
$numSlots.Maximum = 8
|
||||
$numSlots.Value = $(if ([Environment]::ProcessorCount -ge 12) { 2 } else { 1 })
|
||||
$numSlots.BackColor = $cFeld
|
||||
$numSlots.ForeColor = $cText
|
||||
$numSlots.BorderStyle = "FixedSingle"
|
||||
$form.Controls.Add($numSlots)
|
||||
|
||||
$lblKerne = New-Object System.Windows.Forms.Label
|
||||
$lblKerne.Text = "von $([Environment]::ProcessorCount) Kernen"
|
||||
$lblKerne.Location = New-Object System.Drawing.Point(358, 201)
|
||||
$lblKerne.Size = New-Object System.Drawing.Size(166, 18)
|
||||
$lblKerne.ForeColor = $cGedaempft
|
||||
$form.Controls.Add($lblKerne)
|
||||
|
||||
# Zielverzeichnis - frei wählbar, Standard "Programme"
|
||||
$lblPfad = New-Object System.Windows.Forms.Label
|
||||
$lblPfad.Text = "Installieren nach:"
|
||||
@@ -433,10 +463,18 @@ function Do-Install {
|
||||
# Fehlermeldung im Worker unterscheidet genau diese beiden Faelle.
|
||||
$mapZeile = if ($mapping) { "set RIPPY_PATH_MAP=$mapping`r`n" } else { "" }
|
||||
|
||||
$trayBat = "@echo off`r`ncd /d `"%~dp0`"`r`nset REDIS_URL=redis://${rHost}:6379/0`r`nset DATABASE_URL=postgresql://rippy:rippy@${rHost}:5432/rippy`r`nset API_URL=http://${rHost}:8000`r`nset WORKER_NAME=$wName`r`nset RIPPY_TRAY_HOST=$rHost`r`n${mapZeile}set PATH=%~dp0;%PATH%`r`nstart `"`" venv\Scripts\pythonw.exe tray.py"
|
||||
# Gleichzeitige Auftraege. Auf Windows gibt es KEINEN prefork-Pool (kein
|
||||
# fork) - `solo` bedient genau einen Auftrag, `threads` mehrere. Das passt
|
||||
# hier, weil die eigentliche Arbeit ein Kind-Prozess ist (HandBrake) und
|
||||
# der Thread nur darauf wartet.
|
||||
$slots = [int]$numSlots.Value
|
||||
$poolArg = if ($slots -le 1) { "--pool=solo" } else { "--pool=threads --concurrency=$slots" }
|
||||
Log "Gleichzeitige Auftraege: $slots"
|
||||
|
||||
$trayBat = "@echo off`r`ncd /d `"%~dp0`"`r`nset REDIS_URL=redis://${rHost}:6379/0`r`nset DATABASE_URL=postgresql://rippy:rippy@${rHost}:5432/rippy`r`nset API_URL=http://${rHost}:8000`r`nset WORKER_NAME=$wName`r`nset RIPPY_TRAY_HOST=$rHost`r`nset RIPPY_SLOTS=$slots`r`n${mapZeile}set PATH=%~dp0;%PATH%`r`nstart `"`" venv\Scripts\pythonw.exe tray.py"
|
||||
Set-Content -Path "start-tray.bat" -Value $trayBat -Encoding ASCII
|
||||
|
||||
$workBat = "@echo off`r`ncd /d `"%~dp0`"`r`nset REDIS_URL=redis://${rHost}:6379/0`r`nset DATABASE_URL=postgresql://rippy:rippy@${rHost}:5432/rippy`r`nset API_URL=http://${rHost}:8000`r`nset WORKER_NAME=$wName`r`n${mapZeile}set PATH=%~dp0;%PATH%`r`nvenv\Scripts\celery.exe -A celery_app worker --loglevel=info -Q transcode --pool=solo -n ${wName}@%%h"
|
||||
$workBat = "@echo off`r`ncd /d `"%~dp0`"`r`nset REDIS_URL=redis://${rHost}:6379/0`r`nset DATABASE_URL=postgresql://rippy:rippy@${rHost}:5432/rippy`r`nset API_URL=http://${rHost}:8000`r`nset WORKER_NAME=$wName`r`nset RIPPY_SLOTS=$slots`r`n${mapZeile}set PATH=%~dp0;%PATH%`r`nvenv\Scripts\celery.exe -A celery_app worker --loglevel=info -Q transcode $poolArg -n ${wName}@%%h"
|
||||
Set-Content -Path "start-worker.bat" -Value $workBat -Encoding ASCII
|
||||
|
||||
$uninstall = @"
|
||||
|
||||
Reference in New Issue
Block a user