2016-07-11 10 views
0

Ich beginne mit Threads in Python, und versuchen, eine Zusammenführung zu implementieren, wo zu Beginn der Auftrag in 2 Threads aufgeteilt wird. Ich verwende collections.deque, itertools.islice, threading.Thread.Sortieren scheint langsamer mit 2 Threads anstelle von 1

Ich erstelle zwei Threads am Anfang, sie machen jede Hälfte der Arbeit normalerweise, dann schließe ich mich ihnen an und füge das Ergebnis zusammen. Aber ich habe bemerkt, dass es viel länger dauert (fast 2 mal so lang) mit zwei Threads als wenn ich es normalerweise mache.

Wie kann das möglich sein? Here is a link to the code, ich die wichtigsten Teile hier reproduzieren kann, wenn nötig (ich auch diese Frage auf Code Review SE geschrieben, und ich mag lieber diese kurz halten)

Ist es zu this Frage verknüpft (scheint in C ein ähnliches Problem zu sein ++)? Vielen Dank.

+1

Mögliche Duplikate von [Python Multi-Threading langsamer als seriell?] (Http://stackoverflow.com/questions/10789042/python-multi-threading-slower-than-serial) –

+0

Warum der Downvote? – BusyAnt

+2

Obwohl CPythons GIL das Multithreading beschränkt, können Sie immer noch 'multiprocessing' verwenden. –

Antwort

1

Wie kann das möglich sein?

Im Gegensatz zu C++ ist Python wegen der GIL ziemlich schwierig zu parallelisieren.

Während collections.dequeappend und popleft Thread-sicher sind, garantiert dies nicht, dass sie in einem nicht seriellen Paradigma gut funktionieren.

Ist es mit dieser Frage verknüpft?

Nein. Das GIL ist eine Eigenschaft von CPython. Es ist völlig disjunkt von falschem Teilen.

Es dauert viel länger (fast 2 mal so lang) mit zwei Fäden als wenn ich es normal mache.

Dies liegt daran, dass die GIL Shared Memory Multithreading nicht unterstützt. Als solche laufen Sie Ihren Code seriell zweimal.

+0

Sie meinen also, ich kann das mit nur Multi-Threading nicht schneller machen? Was könnte ich tuen ? – BusyAnt

+1

@BusyAnt Ich empfehle Python nicht für Multithread-Anwendungen. Bevorzugen Sie C++, Java, Scala oder fast alles andere. – erip

+0

Ok, ich werde mich daran erinnern. Könnten Sie sagen, was hier die Leistung meines Programms kostet? Thread erstellen? Zwischen den Threads wechseln? Etwas anderes ? Ich bin mir nicht sicher, ob ich das hier vollständig verstanden habe ... – BusyAnt

Verwandte Themen