Sehr einfache gleichzeitige Programmierung in Python

8

Ich habe ein einfaches Python-Skript, das zwei viel kompliziertere Python-Skripte verwendet, und macht etwas mit den Ergebnissen.

Ich habe zwei Module, Foo und Bar, und mein Code ist wie folgt:

%Vor%

Beide Methoden benötigen viel Zeit und keiner hängt vom anderen ab. Die naheliegende Lösung besteht also darin, sie parallel auszuführen. Wie kann ich dies erreichen? Stellen Sie jedoch sicher, dass die Reihenfolge eingehalten wird: Was immer zuerst fertig ist, muss warten, bis das andere fertig ist, bevor das Skript fortgesetzt werden kann. .

Lass mich wissen, wenn ich mich nicht klar genug ausgedrückt habe, ich habe versucht, den Beispielcode so einfach wie möglich zu machen.

BEARBEITEN:

Dank Amber, Ihre Lösung funktioniert mit einer kleinen Änderung.

Anstatt start () für jeden Thread aufzurufen, wenn er erstellt wird, richte ich ihn wie folgt ein:

%Vor%

Ohne dies bekam ich das seltsame Verhalten AttributeError: 'NoneType' object has no attribute 'join' und etwas sehr mit der Nebenläufigkeit. Wenn Sie Ihre Antwort unten bearbeiten, werde ich sie als gelöst markieren.

    
Rory 07.05.2012, 00:29
quelle

2 Antworten

20

Im Allgemeinen verwenden Sie threading , um dies zu tun.

Erstellen Sie zuerst einen Thread für jede Sache, die Sie parallel ausführen möchten:

%Vor%

Um beide zu beenden, verwenden Sie .join() für beide:

%Vor%

An diesem Punkt sind Ihre Ergebnisse in results['a'] und results['b'] , also wenn Sie eine geordnete Liste haben wollten:

%Vor%

Hinweis: Wenn beide Tasks inhärent CPU-intensiv sind, sollten Sie stattdessen multiprocessing in Erwägung ziehen. Aufgrund von Pythons GIL verwendet ein bestimmter Python-Prozess immer nur einen CPU-Kern, während multiprocessing die Aufgaben auf separate Kerne verteilen kann. Es hat jedoch einen etwas höheren Overhead als threading , und wenn die Tasks weniger CPU-intensiv sind, ist es möglicherweise nicht so effizient.

    
Amber 07.05.2012, 00:30
quelle
7
%Vor%

Hier ist die Prozessversion Ihres Programms.

HINWEIS: Beim Threading gibt es gemeinsam genutzte Datenstrukturen, so dass Sie sich um Sperren sorgen müssen, die eine falsche Manipulation von Daten verhindern. Außerdem hat sie, wie oben erwähnt, ein GIL-Problem (Global Interpreter Lock) und beide CPU-intensiven Aufgaben dann bedeutet dies, dass es mehr Zeit dauern wird, da die Aufrufe die Threads der Thread-Erfassung und Freigabe mitteilen. Wenn Ihre Aufgaben jedoch I / O-intensiv waren, hat das keine großen Auswirkungen.

Jetzt, da es keine gemeinsam genutzten Datenstrukturen in einem Prozess gibt, müssen Sie sich keine Sorgen mehr um LOCKS machen und da es unabhängig von der GIL funktioniert, genießen Sie tatsächlich die wahre Stärke von Multiprozessoren.

Einfache Erinnerung: Der Prozess ist derselbe wie der Thread, ohne dass eine gemeinsame Datenstruktur verwendet wird (alles funktioniert isoliert und konzentriert sich auf das Messaging).

Besuche dabeaz.com er hat einmal eine gute Präsentation über die gleichzeitige Programmierung gegeben.

    
fazkan 21.11.2014 19:08
quelle

Tags und Links