Heim  >  Artikel  >  Backend-Entwicklung  >  Kann Python parallel rechnen?

Kann Python parallel rechnen?

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼Original
2019-06-19 11:06:113433Durchsuche

Kann Python parallel rechnen?

Python kann parallele Berechnungen durchführen:

1. Übersicht

Parallel Python ist ein Python-Modul, das einen Mechanismus für die parallele Ausführung von Python-Code auf SMP (Systemen mit mehreren Prozessoren oder Multi-Cores) und Clustern (über ein Netzwerk verbundene Computer) bereitstellt ). Es ist leichtgewichtig, einfach zu installieren und in andere Python-Software zu integrieren. Parallel Python ist ein Open-Source- und plattformübergreifendes Modul, das in reinem Python geschrieben ist. 2. Funktionen

Python-Code parallel auf SMP und Clustern ausführen

Einfach zu verstehen und zu implementieren. Jobbasierte Parallelisierungstechnologie (einfach parallele Konvertierung serieller Anwendungen)

Optimale Konfiguration automatisch erkennen (Anzahl der Worker-Prozesse ist standardmäßig auf die effektive Anzahl von Prozessoren eingestellt)

Dynamische Prozessorzuteilung (Anzahl der Worker-Prozesse kann zur Laufzeit geändert werden)

Geringer Overhead für nachfolgende Jobs mit derselben Funktionalität (implementieren Sie transparentes Caching, um den Overhead zu reduzieren)

Dynamischer Lastausgleich (Jobs werden während der Ausführung auf die Prozessoren verteilt)

Fehlertoleranz (bei Knotenausfall). , Aufgaben werden auf anderen Knoten neu geplant)

Automatische Erkennung von Computerressourcen

Dynamische Zuweisung von Computerressourcen (das Ergebnis der automatischen Erkennung und Fehlertoleranz)

Netzwerkverbindung SHA- basierte Authentifizierung

Plattformübergreifende Portabilität und Interoperabilität (Windows, Linux, Unix, Mac OS X)

Architekturübergreifende Portabilität und Interoperabilität (x86, x86 -64 usw.)

Open Source

Verwandte Empfehlungen: „Python-Video-Tutorial

3. Motivation

Heutzutage wird Software geschrieben in Python wird in vielen Anwendungen verwendet, einschließlich Geschäftslogik, Datenanalyse und wissenschaftlichem Rechnen. Dies führt zusammen mit der breiten Verfügbarkeit von SMP-Computern (Multiprozessor oder Multicore) und Clustern (über ein Netzwerk verbundene Computer) auf dem Markt zu einem Bedarf an paralleler Ausführung von Python-Code.

Der einfachste und gebräuchlichste Weg, parallele Anwendungen für SMP-Computer zu schreiben, ist die Verwendung von Threads. Wenn die Anwendung jedoch rechnerisch mithilfe von Threads gebunden ist oder das Thread-Python-Modul die parallele Ausführung von Python-Bytecode nicht zulässt. Der Grund dafür ist, dass der Python-Interpreter die GIL (Global Interpreter Lock) für die interne Abrechnung verwendet. Diese Sperre ermöglicht die gleichzeitige Ausführung nur einer Python-Bytecode-Anweisung, selbst auf SMP-Maschinen.

Das PP-Modul überwindet diese Einschränkung und bietet eine einfache Möglichkeit, parallele Python-Anwendungen zu schreiben. Intern nutzt ppsmp Prozesse und IPC (Inter-Prozess-Kommunikation), um parallele Berechnungen zu organisieren. Alle Details und Komplexitäten des letzteren werden vollständig berücksichtigt, die Anwendung übermittelt lediglich den Auftrag und ruft seine Ergebnisse ab (die einfachste Möglichkeit, parallele Bewerbungen zu schreiben).

Um die Sache noch besser zu machen, funktioniert in PP geschriebene Software parallel, sogar auf vielen Computern, die über ein lokales Netzwerk oder das Internet verbunden sind. Plattformübergreifende Portabilität und dynamischer Lastausgleich ermöglichen PP eine effiziente Parallelisierung der Datenverarbeitung auch auf heterogenen und plattformübergreifenden Clustern.

4. Installation

Jede Plattform: Laden Sie das Modularchiv herunter und extrahieren Sie es in ein lokales Verzeichnis. Führen Sie das Installationsskript aus: python setup.py install

Windows: Laden Sie die Binärdatei des Windows-Installationsprogramms herunter und führen Sie sie aus.

5. Beispiel

import math, sys, time
import pp
def isprime(n):
    """Returns True if n is prime and False otherwise"""
    if not isinstance(n, int):
        raise TypeError("argument passed to is_prime is not of 'int' type")
    if n < 2:
        return False
    if n == 2:
        return True
    max = int(math.ceil(math.sqrt(n)))
    i = 2
    while i <= max:
        if n % i == 0:
            return False
        i += 1
    return True
def sum_primes(n):
    """Calculates sum of all primes below given integer n"""
    return sum([x for x in xrange(2,n) if isprime(x)])
print """Usage: python sum_primes.py [ncpus]
    [ncpus] - the number of workers to run in parallel, 
    if omitted it will be set to the number of processors in the system
"""
# tuple of all parallel python servers to connect with
ppservers = ()
#ppservers = ("10.0.0.1",)
if len(sys.argv) > 1:
    ncpus = int(sys.argv[1])
    # Creates jobserver with ncpus workers
    job_server = pp.Server(ncpus, ppservers=ppservers)
else:
    # Creates jobserver with automatically detected number of workers
    job_server = pp.Server(ppservers=ppservers)
print "Starting pp with", job_server.get_ncpus(), "workers"
# Submit a job of calulating sum_primes(100) for execution. 
# sum_primes - the function
# (100,) - tuple with arguments for sum_primes
# (isprime,) - tuple with functions on which function sum_primes depends
# ("math",) - tuple with module names which must be imported before sum_primes execution
# Execution starts as soon as one of the workers will become available
job1 = job_server.submit(sum_primes, (100,), (isprime,), ("math",))
# Retrieves the result calculated by job1
# The value of job1() is the same as sum_primes(100)
# If the job has not been finished yet, execution will wait here until result is available
result = job1()
print "Sum of primes below 100 is", result
start_time = time.time()
# The following submits 8 jobs and then retrieves the results
inputs = (100000, 100100, 100200, 100300, 100400, 100500, 100600, 100700)
jobs = [(input, job_server.submit(sum_primes,(input,), (isprime,), ("math",))) for input in inputs]
for input, job in jobs:
    print "Sum of primes below", input, "is", job()
print "Time elapsed: ", time.time() - start_time, "s"
job_server.print_stats()

Das obige ist der detaillierte Inhalt vonKann Python parallel rechnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn