endlos while-Schleife mit Unterbrechung (usleep)

  • Hab da paar tools die in while-Schleifen laufen.
    Da man ja aber ohne Pausen die CPU ins endlose jagen würde, hab ich Pausen eingebaut.


    Einfache Pause kommt aber nicht in Frage, denn die work kommt wann sie will.
    Ich kann also nicht sagen: usleep(1000), denn innerhalb der Zeit kann schon wieder Arbeit in der Warteschlange hängen.
    Also hab ich versucht ein "Schalf solange, bis zu feststellst, dass Du was zu tun hast" - zu schreiben.


    Das funktioniert auch. Nur suche ich gerade nach Alternativen/Verbesserungen.


    Einfaches Bsp:


    Das Problem momentan: wenn es mal richtig "los geht", dann würde das Script gar keine Pause brauchen.
    Es würde bei Vollast also schneller laufen, zu gemütlichen Zeiten aber sinnlos CPU verbrennen.


    Jemand damit Erfahrung? Ideen? =)


    EDIT: der Unterschied bei Vollast ist enorm: mit der for-Schleifenpause nur halb so schnell.
    Und das obwohl die for-Schleife nur einmal durchlaufen wird und nicht bis zum usleep kommt.


    Hab sogar goto getestet - wird aber auch nicht schneller =)

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von cottton ()

  • Ich fürchte das eine Endlosschleife unter PHP nicht realisierbar ist. Ursache ist die begrenzte Laufzeit, die der Server dem Script zur Verfügung stellt.


    Wie viele Sekunden (Standard ist 30) dem Script zur Verfügung stehen, kann der php.ini entnommen werden unter dem Eintrag max_execution_time.


    Wenn Du die php.ini nicht einsehen kannst, nutze einfach mal phpinfo. Sofern es der Provider zulässt, kann mit set_time_limit die Zeit auch raufgesetzt werden, doch das dürfte eher unwahrscheinlich sein und ist dennoch keine wirkliche Lösung.




    Also: Endlosschleifen unter PHP sind im Grunde nicht möglich.


    Ich empfehle sog. CronJobs. Dabei wird ein PHP-Script in einer zuvor definierten Regelmäßigkeit aufgerufen. Ich denke damit bist Du besser beraten.

  • Sollte die Bedingung für break nicht erreicht werden, wird die Zeit ein Problem, das sollte man ihm klar machen. PHP schmeißt immerhin einen schweren Laufzeit-Fehler.

  • Na gut, dann zurück zum Problem:


    Wie kommen denn die Aufträge rein? Vielleicht als Datei in einem Ordner?


    Dann könnte inotify_init ein Lösungsansatz sein.

  • Endlos ist möglich.
    Screen/Console öffnen, {pfad}/php.exe {pfad}/{scriptname}.php
    eingeben und feuer frei =)
    Die max execution time muss natürlich auf 0 gesetzt werden.
    Bsp:


    Zum Thema:
    die Aufträge kommen ohne Muster. Es sind mehrere Tools die untereinander Daten per Commands (Socket oder direkt über PHP-arrays) austauschen (nutze (php)pthreads).
    (werd evtl mal ein kleines Tut zu pthreads schreiben, falls es jemand interessiert)


    Es geht also einfach nur um das Handhaben der Pause.
    Das Script weiß nie, wann die nächste Arbeit for work_1, _2, oder _3 ansteht. Kann daher nicht statisch für x usec Schlafen.
    Mit der for-Schleife teile ich also die Pausenzeit in Teile.
    Allerdings bei Volllast (es würde keine Pause gebraucht) bremst die for-Schleife den Ablauf aus.
    Ich denke, dass alleine die ~Anwesenheit der for-Schleife das Problem ist.

  • und wenn du vor der schleife n 'exit' schmeist oder so?
    goto vor der schleife hast du schon ausprobiert? (nicht das ich das cool fände aber egal :D )

  • Deswegen ja ein pseudo exit :D
    Was eben nur die schleife überspringt ala goto ^^


    Also vor der FOR schleife checken ob deine Arrays Inhalt haben.. dann direkt zum abarbeiten springen bzw n IF drum rum..

  • Ah, klar - verstanden.
    Gerade mal Schnelltest gemacht - brachte ~4%
    Ohne goto allerdings. Ich brauch ja schon ein if. Und mit if und goto wird es deutlich langsamer.


    Muss ich mal weiter testen.
    Tnx =)


    EDIT:


    tests zum Abschluss:


    Ich entscheide mich dann mal für die schnellste Variante -- test 3, auch wenn ich die Zuweisung der work 2 mal im code stehen hab =)

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von cottton ()