Je me demandais s'il existe une bibliothèque pour les appels de méthodes asynchrones en Python . Ce serait génial si vous pouviez faire quelque chose comme
@async
def longComputation():
<code>
token = longComputation()
token.registerCallback(callback_function)
# alternative, polling
while not token.finished():
doSomethingElse()
if token.finished():
result = token.result()
Ou pour appeler une routine non asynchrone de manière asynchrone
def longComputation()
<code>
token = asynccall(longComputation())
Ce serait formidable d'avoir une stratégie plus raffinée en tant que native dans le noyau de la langue. Cela a-t-il été envisagé?
python
asynchronous
Stefano Borini
la source
la source
async
etawait
syntaxe de 3,5).Réponses:
Vous pouvez utiliser le module multiprocesseur ajouté dans Python 2.6. Vous pouvez utiliser des pools de processus, puis obtenir des résultats de manière asynchrone avec:
Par exemple:
Ce n'est qu'une alternative. Ce module fournit de nombreuses fonctionnalités pour réaliser ce que vous voulez. De plus, il sera très facile d'en faire un décorateur.
la source
from multiprocessing.dummy import Pool
. multiprocessing.dummy a exactement le même comportement implémenté sur les threads au lieu des processusQuelque chose comme:
Consultez la documentation sur https://docs.python.org/library/threading.html pour plus de détails.
la source
À partir de Python 3.5, vous pouvez utiliser des générateurs améliorés pour les fonctions asynchrones.
Syntaxe du générateur améliorée:
Nouvelle
async/await
syntaxe:la source
Ce n'est pas dans le noyau du langage, mais une bibliothèque très mature qui fait ce que vous voulez est Twisted . Il introduit l'objet Deferred, auquel vous pouvez attacher des rappels ou des gestionnaires d'erreurs ("errbacks"). Un différé est essentiellement une «promesse» qu'une fonction aura un résultat éventuellement.
la source
Vous pouvez implémenter un décorateur pour rendre vos fonctions asynchrones, bien que ce soit un peu délicat. Le
multiprocessing
module est plein de petites bizarreries et de restrictions apparemment arbitraires - raison de plus pour l'encapsuler derrière une interface conviviale, cependant.Le code ci-dessous illustre l'utilisation du décorateur:
Dans un cas réel, j'aborderais un peu plus le décorateur, en fournissant un moyen de le désactiver pour le débogage (tout en gardant la future interface en place), ou peut-être une facilité pour gérer les exceptions; mais je pense que cela démontre assez bien le principe.
la source
Juste
la source
Vous pouvez utiliser eventlet. Il vous permet d'écrire ce qui semble être du code synchrone, mais de le faire fonctionner de manière asynchrone sur le réseau.
Voici un exemple de robot d'exploration super minimal:
la source
Ma solution est:
Et fonctionne exactement comme demandé:
la source
Quelque chose comme ça fonctionne pour moi, vous pouvez alors appeler la fonction, et elle se répartira sur un nouveau thread.
la source
Y a-t-il une raison de ne pas utiliser de threads? Vous pouvez utiliser la
threading
classe. Au lieu de lafinished()
fonction, utilisez leisAlive()
. Laresult()
fonction pourraitjoin()
le thread et récupérer le résultat. Et, si vous le pouvez, remplacez les fonctionsrun()
et__init__
pour appeler la fonction spécifiée dans le constructeur et enregistrez la valeur quelque part dans l'instance de la classe.la source
Vous pouvez utiliser concurrent.futures (ajouté dans Python 3.2).
la source
Vous pouvez utiliser process. Si vous voulez l'exécuter pour toujours, utilisez-le (comme le réseau) dans votre fonction:
si vous voulez juste l'exécuter une fois, faites comme ça:
la source