Multi Threading? Über Umwege?
Molloy
- javascript
0 Thomas J.S.0 Molloy
0 JürgenB
Hallo Forum,
ich beschäftige mich derzeit mit der Aufgabe die Client-Server Kommunikation mit AJAX sicherer zu gestalten und greife dazu auf eine Javascript-Bibliothek zurück, die mir die asymmetrische Verschlüsselung mittels RSA erlaubt.
(Ja, ich kenne SSL. Nein, ich möchte es hier nicht verwenden. Das ist ein Privatprojekt, soll nicht produktiv benutzt werden. Es geht mir mehr um die Herausforderung)
Das harmoniert auch alles wunderbar mit dem PHP-Backend, nur auf der Client Seite ist man immer für mehrere Sekunden total blockiert, während unter Javascript die Verschlüsselung stattfindet.
Idealerweise sollte man schon die nächste Nachricht tippen können, während verschlüsselt wird.
Ich hab die zeitintensiven Stellen in der RSA-Bibliothek aufgespürt und mein Umweg wäre setTimeout() zu verwenden, aber intern geschieht die Verschlüsselung über 5 Ebenen von Funktionsaufrufen und alle Funktionen so zu gestalten, dass sie asynchron aufgerufen werden, Ergebnisse zwischenspeicerhn, weiterreichen, etc. wäre ein programmiertechnischer Alptraum.
Wenn ich das de-/enkodieren in separate Threads auslagern könnte, so wie ich es von anderen Sprachen gewohnt bin, könnte ich mir den riesigen Aufwand sparen und so arbeiten wie bisher.
Google und das Forumsarchiv haben mir nicht helfen können, aber vielleicht gibts ja in der Zwischenzeit einen Lösungsansatz oder jemand hat ne völlig andere Idee, die mir helfen könnte?
Hallo,
[...]
Wenn ich das de-/enkodieren in separate Threads auslagern könnte, so wie ich es von anderen Sprachen gewohnt bin, könnte ich mir den riesigen Aufwand sparen und so arbeiten wie bisher.
Google und das Forumsarchiv haben mir nicht helfen können, aber vielleicht gibts ja in der Zwischenzeit einen Lösungsansatz oder jemand hat ne völlig andere Idee, die mir helfen könnte?
Vielleicht hilft weiter http://ajaxian.com/archives/javascript-threading-and-continuations
Grüße
Thomas
Hallo,
[...]
Wenn ich das de-/enkodieren in separate Threads auslagern könnte, so wie ich es von anderen Sprachen gewohnt bin, könnte ich mir den riesigen Aufwand sparen und so arbeiten wie bisher.
Google und das Forumsarchiv haben mir nicht helfen können, aber vielleicht gibts ja in der Zwischenzeit einen Lösungsansatz oder jemand hat ne völlig andere Idee, die mir helfen könnte?Vielleicht hilft weiter http://ajaxian.com/archives/javascript-threading-and-continuations
Grüße
Thomas
Danke, ich konnte die Bibliothek zwar erst nach einem Umweg zu archive.org downloaden, aber die sah wirklich vielversprechend aus.
Sah...
Als ich versucht hab über das Framework den neuen Thread zu starten kam aber das alte Problem: Totale Blockade des Browsers für mehrere Sekunden :/
Danach wollt ich noch kreativ sein und über AJAX die aktuelle URL wieder aufrufen, dabei aber einen Parameter setzen, der PHP anweist, folgenden Code auszuspucken:
...
var newKey = rsaGenerate(1024);
document.write(newKey);
document.close()
...
Naja, der AJAX-Request hat mir stattdessen immer den *Quelltext* der Seite zurückgeliefert. War wohl zu optimistisch zu hoffen, dass der Javascript-Teil erst ausgewertet wird, bevor der request zurückkommt ^^;
Als letztes habe ich über window.open() versucht in dem neuen Fenster den Schlüssel zu generieren und ihn an das Ursprungsfenster zurückzusenden.
Der Focus wechselt dabei sofort auf das Originalfenster zurück, also werkelt das Popup komplett im Hintergrund, bevor es sich selber schliesst.
Der Firefox blockiert hierbei leider immer noch total, selbst wenn die Schlüsselerzeugung in einem völlig neuen Fenster (also kein Tab) stattfindet :(
Momentan sitz ich also vor den 1300 Zeilen des RSA-Frameworks und fange an, die zig Funktionsaufrufe mit setTimeout() zu spicken...
Weiss jemand vielleicht ob Multithreading wenigstens für JavaScript 2.0 angedacht ist?
Hallo Molloy,
wenn rechenintensive Scripte laufen, neigen einige Browser wie z.B. FF und IE dazu, einzufrieren. Das geht soweit, dass sogar das Rendern eingestellt wird und auch die Bedienelemente des Browsers nicht mehr genutzt werden können. Auf meinen teilweise recht rechenintensiven Seiten habe ich daher die Rechenschleifen durch sich mittels windows.setTimeout selbst aufrufende Funktionen ersetzt. Die Verzögerungszeit kann dabei ruhig auf eine Millisekunde gesetzt werden. Dadurch bekommt das Browser-GUI "von Zeit zu Zeit" die Kontrolle zurück und kann auf Benutzeraktionen reagieren.
Gruß, Jürgen
PS: Mein Versuch, auf diese Weise zwei "Threads" zu starten, um die Dual Core CPU voll zu nutzen, war leider nicht von Erfolg gekrönt. Maximale CPU-Auslastung leider immer noch 50 %.