Hallo Entwicklerkollegen,
ich experimentiere grade mit Blocking.pm und stehe vor einer Aufgabe, zu der ich seit zwei Stunden keine Lösung finde.
- Funktion wird per BlockingCall($funktionsName,$hash,$finishFn,60) aufgerufen.
- $funktionsName liefert als Ergebnis einen %ergebnisHash
- Wie muss ich das Ergebnis aus $funktionsName zurückgeben und wie muss $finishFn dieses Ergebnis übernehmen, damit ich damit weiterarbeiten kann?
Bestimmt sehe ich einfach mal wieder vor lauter Bäumen den Wald nicht :(
Hash aul Return-Wert dürfte das Problem sein. Die Rückgabe wird doch serialisiert, also muss das ein String sein. Im SYSMON habe ich genau so gemacht, alles mit einem Trennzeichen in ein String und dann in finishFn wieder auseinandernhmen.
Die Idee hatte ich auch schon. Aber irgendwie habe ich das Bauchgefühl, dass das auch einfacher gehen muss. Bestimmt irgendwie über Referenzen oder so, aber damit stehe ich auf Kriegsfuß.
Sag Bescheid, wenn Du eine bessere Idee findest. Glaube aber eher nicht daran, da zwischen zwei getrennten Prozessen keine Referenzen funktionieren werden (ok, theoretisch wäre SharedMemory & Co. schon denkbar).
es geht leider nicht wirklich einfacher. die rückgabe muss ein einzeiliger string sein. d.h. er darf keine zeilenumbrüche enthalten. die einschränkung kommt daher das die rückgabe durch telnet muss.
wenn du nicht selber serialisieren willst funktioniert es mit encode_json gut. auf der anderen seite dann mit decode_json wieder auspacken.
wichtig ist das du nich den namen des devices das BlockingCall aufgerufen hat aus $funktionsName wieder mit zurück an $finishFn zurück gibst. das geht nicht automatisch.
statt Blocking.pm kannst du dir auch SubProcess.pm anschauen. da die kommunikation hier per direkt per socket erfolgt fällt die einschränkung mit den zeilenumbrücken weg und du musst auch keinen device namen zurück geben. serialisieren musst du aber immer noch.
Danke für die Erklärungen.
Habe mein "Problem" nun wie vorgeschlagen mit einem ziemlich langen String als Rückgabewert gelöst.