Me preguntaba si hay alguna biblioteca para llamadas a métodos asincrónicos en Python . Sería genial si pudieras hacer algo como
@async
def longComputation():
<code>
token = longComputation()
token.registerCallback(callback_function)
# alternative, polling
while not token.finished():
doSomethingElse()
if token.finished():
result = token.result()
O para llamar a una rutina no asíncrona asincrónicamente
def longComputation()
<code>
token = asynccall(longComputation())
Sería genial tener una estrategia más refinada como nativa en el núcleo del lenguaje. ¿Se consideró esto?
python
asynchronous
Stefano Borini
fuente
fuente
async
yawait
sintaxis desde 3.5).Respuestas:
Puede usar el módulo de multiprocesamiento agregado en Python 2.6. Puede usar grupos de procesos y luego obtener resultados de forma asincrónica con:
P.ej:
Esta es solo una alternativa. Este módulo proporciona muchas facilidades para lograr lo que desea. También será muy fácil hacer un decorador a partir de esto.
fuente
from multiprocessing.dummy import Pool
. multiprocessing.dummy tiene exactamente el mismo comportamiento implementado sobre hilos en lugar de procesosAlgo como:
Consulte la documentación en https://docs.python.org/library/threading.html para obtener más detalles.
fuente
A partir de Python 3.5, puede usar generadores mejorados para funciones asíncronas.
Sintaxis mejorada del generador:
Nueva
async/await
sintaxis:fuente
No está en el núcleo del lenguaje, pero una biblioteca muy madura que hace lo que quieres es Twisted . Introduce el objeto diferido, al que puede adjuntar devoluciones de llamada o controladores de errores ("errbacks"). Un aplazado es básicamente una "promesa" de que una función tendrá un resultado eventualmente.
fuente
Puede implementar un decorador para que sus funciones sean asíncronas, aunque eso es un poco complicado. Sin
multiprocessing
embargo, el módulo está lleno de pequeños caprichos y restricciones aparentemente arbitrarias, una razón más para encapsularlo detrás de una interfaz amigable.El siguiente código ilustra el uso del decorador:
En un caso del mundo real, trabajaría un poco más en el decorador, proporcionando alguna forma de desactivarlo para la depuración (manteniendo la interfaz futura en su lugar), o tal vez una instalación para manejar excepciones; pero creo que esto demuestra el principio lo suficientemente bien.
fuente
Sólo
fuente
Podrías usar eventlet. Le permite escribir lo que parece ser un código síncrono, pero que funcione de manera asíncrona a través de la red.
Aquí hay un ejemplo de un rastreador súper mínimo:
fuente
Mi solución es:
Y funciona exactamente como se solicitó:
fuente
Algo como esto funciona para mí, puede llamar a la función y se enviará a un nuevo hilo.
fuente
¿Hay alguna razón para no usar hilos? Puedes usar la
threading
clase. En lugar de lafinished()
función, use elisAlive()
. Laresult()
función podríajoin()
el hilo y recuperar el resultado. Y, si puede, anule las funcionesrun()
y__init__
para llamar a la función especificada en el constructor y guarde el valor en algún lugar en la instancia de la clase.fuente
Puede usar concurrent.futures (agregado en Python 3.2).
fuente
Puedes usar el proceso. Si desea ejecutarlo para siempre, use while (como redes) en su función:
si solo quieres ejecutarlo una vez, hazlo así:
fuente