Ich versuche, Code zu optimieren, der eine Datei lädt und die Daten in Perl analysiert.Perl: Build komplexer Objektbaum mit mehreren Threads
Hintergrund
- Die Daten endet in einem komplizierten Objekt Baum.
- Das oberste Objekt ist ein gesegnetes Paket.
- Einige der verschachtelten Objekte werden als ein anderes gesegnetes Paketart-Call-Element neugestaltet.
- Der erste Durchlauf trennt die Binärdaten in Einheiten und Segmente innerhalb einer Einheit, die alle in mehreren Arrays gespeichert sind.
- Es könnte 20 oder 50 Einheiten mit je 8 Segmenten geben.
- Der zweite Durchlauf führt die Decodierung der binären Daten durch und ist optimiert für die Geschwindigkeit.
Ansatz mit Gewinde
- Ich versuche, die Module Threads und Threads zu verwenden :: geteilt.
- Ich möchte, dass jeder Thread eine Teilmenge der Einheiten verarbeitet und die Daten in einen gemeinsamen Objektbaum auffüllt.
- Ich habe Schwierigkeiten zu sehen, wie mehrere Threads Objekte in einen gemeinsamen Objektbaum einfügen, indem Sie das threads: shared module verwenden. Insbesondere wenn Objekte vom Typ Item aus einem Thread-Kontext gesegnet sind. Die Klassen- (Paket-) Funktionen sind nicht an das Objekt gebunden, wie ich es verstehe.
- Ich erkenne, dass an bestimmten Punkten im Code der Code die threads :: shared :: lock() -Funktion verwenden muss, bevor Objekte zum Objektbaum hinzugefügt werden.
- Insbesondere die verschachtelten gesegneten Item-Objekte würden von jedem Thread-Kontext zugewiesen werden.
- Die threads :: shared documentation sagt "Beachten Sie, dass es oft nicht ratsam ist, ein Objekt zu teilen, es sei denn, die Klasse selbst wurde geschrieben, um die Freigabe zu unterstützen".
- Gibt es einen Beispielcode, der zeigt, wie dies zu erreichen ist?
Ich bin auf der Suche nach Beispielcode, der zeigt, wie gesegnete Objekte, die von einem beliebigen Threadkontext zugewiesen und gesegnet werden können, in einen gemeinsamen Objektbaum eingefügt werden. Und dann ist von dem Hauptthread aus auf die Daten für Datensuchvorgänge zu gehen. Die Decodierungsthreads werden zurückkehren, sobald die Decodierung abgeschlossen ist.
Die Dokumentation sagt auch „Objekt destructor mehrmals aufgerufen werden kann, eine für jeden Anwendungsbereich Ausgang des Threads“. Wie wird das richtig gehandhabt?
Dank J.R.
ich die Antwort zu schätzen wissen. Die Dokumentation für "Thread :: Warteschlange" besagt, dass die Übergabe von Objekten in Warteschlangen möglicherweise nicht funktioniert, wenn die Klassen der Objekte die Freigabe nicht unterstützen. Weitere Informationen finden Sie unter BUGS UND LIMITATIONS in threads :: shared. Das Übergeben von Array/Hash-Referenzen, die Objekte enthalten, funktioniert für Perl möglicherweise nicht vor 5.10.0. Es sieht so aus, als ob ich mit meinen gesegneten Objekten die gleichen Einschränkungen habe. Auch diese Anwendung ist leider immer noch auf Perl 5.8.8. –
Ich kann nicht herausfinden, wie man mit diesem Kommentareditor Zeilenumbrüche erstellt. –
Sie übergeben keine Objekte. Sie übergeben serialisierte Objekte als Skalare. – Sobrique