Ich habe mich gefragt, ob es in Python eine Bibliothek für asynchrone Methodenaufrufe gibt . Es wäre großartig, wenn Sie so etwas tun könnten
@async
def longComputation():
<code>
token = longComputation()
token.registerCallback(callback_function)
# alternative, polling
while not token.finished():
doSomethingElse()
if token.finished():
result = token.result()
Oder um eine nicht asynchrone Routine asynchron aufzurufen
def longComputation()
<code>
token = asynccall(longComputation())
Es wäre großartig, eine verfeinerte Strategie als Muttersprache im Sprachkern zu haben. Wurde dies berücksichtigt?
python
asynchronous
Stefano Borini
quelle
quelle
async
undawait
Syntax von 3.5).Antworten:
Sie können das in Python 2.6 hinzugefügte Multiprocessing-Modul verwenden . Sie können Prozesspools verwenden und dann asynchron Ergebnisse erhalten mit:
Z.B:
Dies ist nur eine Alternative. Dieses Modul bietet viele Möglichkeiten, um das zu erreichen, was Sie wollen. Es wird auch sehr einfach sein, daraus einen Dekorateur zu machen.
quelle
from multiprocessing.dummy import Pool
. multiprocessing.dummy hat genau das gleiche Verhalten über Threads anstelle von Prozessen implementiertEtwas wie:
Weitere Informationen finden Sie in der Dokumentation unter https://docs.python.org/library/threading.html .
quelle
Ab Python 3.5 können Sie erweiterte Generatoren für asynchrone Funktionen verwenden.
Erweiterte Generatorsyntax:
Neue
async/await
Syntax:quelle
Es ist nicht im Sprachkern, aber eine sehr ausgereifte Bibliothek, die macht, was Sie wollen, ist Twisted . Es wird das verzögerte Objekt eingeführt, an das Sie Rückrufe oder Fehlerbehandlungsroutinen ("Errbacks") anhängen können. Ein Zurückgestelltes ist im Grunde ein "Versprechen", dass eine Funktion irgendwann ein Ergebnis haben wird.
quelle
Sie können einen Dekorator implementieren, um Ihre Funktionen asynchron zu machen, obwohl dies etwas schwierig ist. Das
multiprocessing
Modul ist voll von kleinen Macken und scheinbar willkürlichen Einschränkungen - umso mehr Grund, es hinter einer benutzerfreundlichen Oberfläche zu kapseln.Der folgende Code veranschaulicht die Verwendung des Dekorateurs:
In einem realen Fall würde ich etwas mehr auf den Dekorator eingehen und ihm eine Möglichkeit bieten, ihn für das Debuggen auszuschalten (während die zukünftige Benutzeroberfläche beibehalten wird), oder vielleicht eine Möglichkeit, mit Ausnahmen umzugehen. aber ich denke, das zeigt das Prinzip gut genug.
quelle
Gerade
quelle
Sie könnten Eventlet verwenden. Sie können damit scheinbar synchronen Code schreiben, ihn jedoch asynchron über das Netzwerk arbeiten lassen.
Hier ist ein Beispiel für einen Super-Minimal-Crawler:
quelle
Meine Lösung ist:
Und funktioniert genau wie gewünscht:
quelle
So etwas funktioniert bei mir, Sie können dann die Funktion aufrufen und sie wird sich auf einen neuen Thread versenden.
quelle
Gibt es einen Grund, keine Threads zu verwenden? Sie können die
threading
Klasse verwenden.finished()
Verwenden Sie anstelle der Funktion dieisAlive()
. Dieresult()
Funktion könntejoin()
den Thread und das Ergebnis abrufen. Und, wenn Sie können, überschreiben dierun()
und__init__
Funktionen die Funktion im Konstruktor angegeben aufrufen und den Wert irgendwo auf die Instanz der Klasse speichern.quelle
Sie können concurrent.futures verwenden (hinzugefügt in Python 3.2).
quelle
Sie können process verwenden. Wenn Sie es für immer ausführen möchten, verwenden Sie während (wie beim Netzwerk) in Ihrer Funktion:
Wenn Sie es nur einmal ausführen möchten, gehen Sie folgendermaßen vor:
quelle