wie durchnummerieren
Norbert
- php
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?
Wichtig ist, dass es sich dabei um eine fortlaufende Nummer handelt, also kein MD5-Hash oder dergleichen.
Gruss und Dank
Norbert
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
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
Hello,
wenn du wirklich einen Prozessbaum durchnummerieren möchtest, bietet sich vielleicht das Nested Sets-Modell an.
MfG
Rouven
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
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
Hi Norbert,
Wie organisiert man das richtig, so dass auch bei 1024 Scripten keine doppelten ID's auftauchen?
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:
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):
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
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.
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
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
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.
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
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.