2010-12-16 4 views
1

Ich bin etwas Code ausgeführt, der X Arbeiter hat, jeder Arbeiter zieht Aufgaben aus einer Warteschlange jede Sekunde. Dazu benutze ich twisted task.LoopingCall() Funktion. Jeder Worker erfüllt seine Anforderung (schabt einige Daten) und schiebt dann die Antwort zurück zu einer anderen Warteschlange. All dies geschieht im Reaktor-Thread, da ich dies nicht auf irgendeinen anderen Thread vertage.Twisted - sollte dieser Code in separaten Threads ausgeführt werden

Ich frage mich, ob ich alle diese Jobs in separaten Threads ausführen oder sie so lassen sollte, wie sie sind. Und wenn ja, gibt es ein Problem, wenn ich jede Sekunde von jedem Thread task.LoopingCall aufrufen?

Antwort

0

Zuerst, achten Sie darauf, dass Twisted-Reaktor manchmal Multithreads und Aufgaben zuweist, ohne Ihnen etwas zu sagen. Natürlich habe ich Ihr Programm nicht besonders gesehen.

Zweitens, in Python (dh in CPython) hat das Erstellen von Threads für nicht blockierende Berechnungen wenig Vorteile. Lesen Sie die GIL (Global Interpreter Lock).

+1

"Erstens, Vorsicht, dass Twisted-Reaktor manchmal Multithreads" - in keiner Weise, die Sie beobachten können. Wenn du * jemals * feststellst, dass dein Code in einem Nicht-Reaktor-Thread läuft und du nicht darum gebeten hast, ist es ein Fehler, bitte melde ihn (ich kenne keine Fälle, in denen das jemals passiert ist). –

+0

Natürlich meinte ich es nicht willkürlich Multithreads, Jean-Paul, bitte. Ich meinte, Abstraktionen auf hoher Ebene könnten einen Multi-Threaded-Reaktor implementieren, und Sie könnten sich als Benutzer des Codes nicht bewusst sein. Der Mangel an Details im ursprünglichen Beitrag hat mich dazu gebracht, zu glauben, dass OP nicht sein könnte. Gratulation zu der ausgezeichneten Arbeit, die ihr mit Twisted macht. – slezica

1

Sie sollten keine Threads dafür verwenden. Alles im Reaktorfaden zu tun ist in Ordnung. Wenn Ihr Scraping twisted.web.client verwendet, um den Netzwerkzugriff auszuführen, sollte es nicht blockieren, also werden Sie so schnell gehen, wie es geht.

+0

Ja, ich benutze twisted.web.client zum scraping, aber ich war besorgt über den Parsing-Teil, wenn es den Reaktorfaden irgendwie blockieren könnte. – hyperboreean

+0

Parsing ist schnell. Wenn Sie feststellen, dass dies ein Problem ist, können Sie das inkrementelle Parsing wie in http://codespeak.net/lxml/parsing.html#the-feed-parser-interface verwenden – nosklo

2

Nein, Sie sollten keine Threads verwenden. Sie kann nicht Anruf LoopingCall von einem Thread (es sei denn, Sie verwenden reactor.callFromThread), aber es würde Ihnen nicht helfen, Ihren Code schneller zu machen.

Wenn Sie ein Leistungsproblem bemerken, sollten Sie Ihre Arbeitsbelastung profilieren, herauszufinden, wo die CPU-intensive Arbeit ist, und setzen Sie dann, dass die Arbeit in mehrere Prozesse, gelaicht mit spawnProcess. Sie können jedoch nicht den Schritt überspringen, bei dem Sie herausfinden, wo die teure Arbeit steckt: Es gibt keinen magischen Elfenstaub, den Sie auf Ihre Twisted-Anwendung streuen können, die es schneller macht. Wenn Sie einen Teil Ihres Codes auswählen, der nicht sehr intensiv ist und keine Ressourcen wie CPU oder Festplatte blockieren muss, dann werden Sie feststellen, dass der Overhead beim Verschieben von Arbeit in einen anderen Prozess den Nutzen überwiegt.

Verwandte Themen