Norbert: wie durchnummerieren

Hallo,

durch wiederholtes Aufrufen enstehen in vier Schritten 31 laufende Prozesse(Scripte). Soweit ist das ja alles okay. Nun moechte ich jedem Script eine eindeutige ID mitgeben und da fange ich an zu gruebeln. Wie organisiert man das richtig, so dass auch bei 1024 Scripten keine doppelten ID's auftauchen?
Prozessbaum
Wichtig ist, dass es sich dabei um eine fortlaufende Nummer handelt, also kein MD5-Hash oder dergleichen.

Gruss und Dank
Norbert

  1. Hi,

    Soweit ist das ja alles okay. Nun moechte ich jedem Script eine eindeutige ID mitgeben und da fange ich an zu gruebeln. Wie organisiert man das richtig, so dass auch bei 1024 Scripten keine doppelten ID's auftauchen?

    steht Dir $_SERVER["UNIQUE_ID"] zur Verfügung?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi Cheatah,

      steht Dir $_SERVER["UNIQUE_ID"] zur Verfügung?

      hmm,
      falls ja, kann ich sie nicht verwenden, da es eine Zaehlvariable sein soll, die sich ueberblicken laesst.
      Schau einfach im anderen Thread.Zweig mal rein ...

      Gruss und Dank
      Norbert

  2. Hello,

    wenn du wirklich einen Prozessbaum durchnummerieren möchtest, bietet sich vielleicht das Nested Sets-Modell an.

    MfG
    Rouven

    --
    -------------------
    Death is nature's way of telling you to slow down.
    1. Hallo Rouven,

      wenn du wirklich einen Prozessbaum durchnummerieren möchtest, bietet sich vielleicht das Nested Sets-Modell an.

      mit Sicherheit nicht!

      Zuerst wird ein Script [s1] gestartet.
      Dieses startet zwei weitere Scripts [s2] und [s3].
      [s2] und [s3] starten dann die Scripte [s4], [s5], [s6], [s7].
      [s4], [s5], [s6] und [s7] starten [s8], [s9], [s10], [s11], [s12], [s13], [s14], [s15].
      und so weiter und sofort ...

      Natuerlich ist es jedesmal das gleiche Script bzw. die gleiche Datei, die gestartet wird.
      D.h. die ID muss von Script zu Script mit uebergeben werden.
      Leider habe ich dazu derzeit keine Idee ...

      Theoretisch koennte man, aehnlich wie bei einem Counter, eine Datei dazu missbrauchen um eineindeutig hoch zu zaehlen.
      Nur wirklich perfomant ist das nicht ... :-(

      Gruss und Dank
      Norbert

      1. Hi,

        Dieses startet zwei weitere Scripts [s2] und [s3].
        [s2] und [s3] starten dann die Scripte [s4], [s5], [s6], [s7].
        [s4], [s5], [s6] und [s7] starten [s8], [s9], [s10], [s11], [s12], [s13], [s14], [s15].
        und so weiter und sofort ...

        Script n startet also die Scripts 2n und 2n+1

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  3. Hi Norbert,

    Wie organisiert man das richtig, so dass auch bei 1024 Scripten keine doppelten ID's auftauchen?
    Prozessbaum

    Ich habe gerade mal etwas darüber nachgedacht... Wie würde man so etwas im realen Leben durchnummerieren? Ich würde mit Punkt 1 anfangen, dieser hat 1.1 und 1.2 als Unterpunkte. Unter 1.1 gibt es dann 1.1.1 und 1.1.2, unter 1.2 gibt es 1.2.1 und 1.2.1. (Natürlich auch n Unterpunkte möglich, aber in deiner Grafik gibt es immer nur 2 neue Prozesse pro Elternprozess.)

    Unter Festlegung einer maximalen Tiefe könntest du den Prozessen folgende Kennungen geben:

    • 1000000 (Oberster Prozess)
        - 1100000
          - 1110000 (usw.)
          - 1120000 (usw.)
        - 1200000
          - 1210000 (usw.)
          - 1220000 (usw.)

    Wenn du die maximale Tiefe nicht begrenzen willst, könntest du die Zahlen auch rückwärts aufbauen (ich hab die Zahlen mal mit führenden Nullen angegeben):

    • 001 (Oberster Prozess)
        - 011
          - 111 (usw.)
          - 211 (usw.)
        - 021
          - 121 (usw.)
          - 221 (usw.)

    Die Frage ist jetzt, was praktischer ist, wenn du irgendwie mit diesen Werten rechnen musst. Erste Version halte ich für lesbarer, da dies in der Programmierung aber eher nicht so wichtig ist und man zu Debug-Zwecken die Zahl in einen String umwandeln und rückwärts ausgeben kann, wäre die zweite Version vermutlich besser.

    Wichtig ist, dass es sich dabei um eine fortlaufende Nummer handelt, also kein MD5-Hash oder dergleichen.

    Die oberen Zahlen betrachtet man in erster Linie jetzt natürlich als Dezimalzahlen, also ganz normale Zahlen, wie sie in unserem alltäglichen Leben nun mal vorkommen ;-)

    Pro Prozess kannst du hier maximal 9 Kinds-Prozesse erzeugen lassen. Die 0 ist reserviert als Indikator, dass an dieser Stelle keine Information vorliegt (deutet auf Prozess höherer Ebene hin). Mit den Zahlen 1 bis 9 werden die entsprechenden Kinds-Prozesse gekennzeichnet.

    Da du stets nur zwei Kindsprozesse erzeugst, kannst du die Zahlen als Zahlen in einem Zahlensystem mit 3er-Basis betrachten, das sieht dann so aus (links Zahl im 3er-System, rechts im Dezimalsystem):

    000 (Oberster Prozess) = 0

    • 100      = 9
        - 110    = 12
          - 111  = 13
          - 112  = 14
        - 120    = 15
          - 121  = 16
          - 122  = 17
    • 200      = 18
        - 210    = 21
          - 211  = 22
          - 212  = 23
        - 220    = 24
          - 221  = 25
          - 222  = 26

    Nun hast du schon eine... hm... nicht ganz fortlaufende Nummerierung. Die Lücken entstehen, weil bspw. die Werte 101 und 102 unbelegt sind. Das geht meines Erachtens auch nicht anders, weil du sonst den Elternprozess nicht mehr erkennen kannst.

    Vielleicht ist das dann in der Form ja schon OK für dich, da müsste man eigentlich schon mit arbeiten können ;-) Natürlich kannst du die Nummern auch wieder rückwärts laufend notieren (wie oben), aber dann sind die Zahlen im Dezimalsystem nicht mehr so schön fortlaufend *g*

    Viele Grüße,
      ~ Dennis.

    1. Hallo Dennis,

      Deine Idee halte ich fuer sehr gut geeignet.
      Damit wird praktisch eine sprechende ID erzeugt,
      d.h. neben der Unterscheidung kann man auch den Platz im Baum erkennen.

      Gruss und Dank
      Norbert

  4. Moin!

    durch wiederholtes Aufrufen enstehen in vier Schritten 31 laufende Prozesse(Scripte). Soweit ist das ja alles okay. Nun moechte ich jedem Script eine eindeutige ID mitgeben und da fange ich an zu gruebeln. Wie organisiert man das richtig, so dass auch bei 1024 Scripten keine doppelten ID's auftauchen?

    Was spricht gegen die Prozess-ID, die das Betriebssystem sowieso vergibt? Wozu brauchst du diese ID überhaupt?

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
  5. Moin,

    ich würde das nicht unbedingt hirarchisch aufbauen. Mir ist das Ziel, dass du mit der
    Baum-Struktur verfolgst noch nicht ganz klar, daher folgendes nur als Gedankenspiel/Anregung.

    Grundidee:
    Jeder Prozess weiß, wo er in der Struktur seinen Platz findet, wenn er seinen Vorgänger
    kennt und die Ebene, auf der er im Verhältnis zu diesen steht (gleiche Ebene oder
    untergeordnet).

    Ein ID-String für Prozesse auf der ersten Ebene könnte dann so aussehen:

    Prozess1
                                  768
                                   ^
                      Eigene-ID____|

    Ein ID-String für Prozesse auf der Ebene darunter könnte dann so aussehen:

    Prozesse 1.1 und 1.2
                                  768
                          _________|__________
                         |                    |
                      768_367              768_145
                        ^   ^
        Vorgänger-ID____|   |
        Eigene-ID___________|

    Und noch eine Ebene tiefer:

    768
                          _________|__________ _________________
                         |                    |                 |
                      768_367              768_145           768_n+1
                   _____|______          _____|______ ____________
                  |            |        |            |            |
               367_267      367_134   145_78      145_897      145_n+1

    Damit lässt sich eine Struktur mit n Prozessen und n Ebenen darstellen wobei
    es egal ist, wie die ID gestrickt ist. Sie muss nur eindeutig sein.

    Grüße, dicon

    btw: wir haben nach diesem Prinzip eine sehr tief strukturierte, dynamische
    Navigation für ein Projekt realisiert, mit einer kleinen DB im Backend. Inzwischen
    mit fast 800 Items, verteilt auf bis zu 8 Ebenen.

    1. Hallo dicon,

      die Baumstruktur ergibt sich ja automatisch, weil das Script sich selbst zweimal neu startet. Diese zwei neuen Scripte starten dann auch je wieder zwei Scripte und immer so weiter, bis eine Abbruchbedingung das Ganze stoppt.

      Die eindeutige Nummerierung brauche ich, um jedes Script im Logfile wieder zu finden. Und da der Abbruch durch die Ebene bestimmt wird, war Dennis Vorschlag schon mal nicht schlecht und wurde so auch realisiert.

      Gruss und Dank
      Norbert

      1. Hi Norbert,

        Noch ein Tip: Das Erzeugen neuer Prozesse würde ich mit der PCNTL-Funktion pcntl_fork() gestalten.

        Dann dürften die Fehler, welche du in deinem Doppelpost beschrieben hast, eventuell verschwinden. (Du kannst den Text aus deinem Doppelpost übrigens gerne noch mal in diesem Thread als Antwort auf dein Ausgangsposting posten, sonst geht der Text nämlich verloren, weil Doppelposts nicht archiviert werden.)

        Viele Grüße,
          ~ Dennis.