Seite wählen

Futures in Python 3.2

von | Apr 19, 2012 | Linux, Windows, Technology, Development

Seit Version 3.2 unterstützt Python sogenannte „Futures“: Futures sind Tasks, die asynchron ausgeführt werden. Sobald der Benutzer auf den Rückgabewert eines Futures zugreift, wartet die aufrufende Funktion, bis der Task abgeschlossen ist und der Rückgabewert zur Verfügung steht.
Folgendes Beispiel (aus der Python-Dokumentation) zeigt, wie Futures verwendet werden können:

import concurrent.futures
import urllib.request
URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://some-made-up-domain.com/']
def load_url(url, timeout):
    return urllib.request.urlopen(url, timeout=timeout).read()
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future_to_url = dict((executor.submit(load_url, url, 60), url)
                         for url in URLS)
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        if future.exception() is not None:
            print('%r generated an exception: %s' % (url,
                                                     future.exception()))
        else:
            print('%r page is %d bytes' % (url, len(future.result())))

Das Script erstellt zunächst ein ThreadPoolExecutor-Objekt. Dieses stellt einen Thread-Pool dar, in dem die anschließend erstellten Tasks ausgeführt werden. Optional kann hier die maximale Anzahl an Threads (max_workers) angegeben werden. Wer rechenintensive Tasks verwendet, sollte lieber die ProcessPoolExecutor-Klasse verwenden, da Python-Code in mehreren Threads aufgrund des „Global Interpreter Lock“ nicht parallel abläuft.
Mit der „submit“-Methode des ThreadPoolExecutors werden die Tasks dem Thread-Pool zugewiesen und dort eigenständig im Hintergrund ausgeführt.
Die „as_completed“-Methode liefert anschließend alle Tasks in der Reihenfolge zurück, in der sie abgeschlossen wurden. Über die „result“-Methode eines einzelnen Tasks kann auf den Rückgabewert des Tasks zugegriffen werden.
Weitere Informationen zu Futures in Python gibt es z.B. in der Python-Dokumentation. Das Future/Promise-Konzept wird auch von einer Reihe anderer Sprachen unterstützt, so z.B. in C++11 mit std::future.

0 Kommentare

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Mehr Beiträge zum Thema Linux | Windows | Technology | Development

Kibana Sicherheits-Updates: CVSS:Critical

Und täglich grüßt das Murmeltier. Nein nicht ganz. Heute ist es  aus der Elastic Stack Werkzeugkiste Kibana, für das es ein wichtiges Sicherheits-Update gibt. Es besteht auf jeden Fall Handlungsbedarf! IMHO auch wenn ihr die "Reporting" Funktion deaktiviert habt. Der...