2010-07-11 26 views
49

¿Existe una noción genérica de programación asincrónica en python? ¿Podría asignar una devolución de llamada a una función, ejecutarla y volver al flujo principal del programa inmediatamente, sin importar cuánto tiempo demore la ejecución de esa función?programación asincrónica en python

+1

relacionados http://nichol.as/asynchronous-servers-in-python – jfs

+2

Hay bastante novedades [nuevos desarrollos en el campo] (http://stackoverflow.com/questions/3221314/asynchronous-programming-in- python/18099524 # answer-18099524). –

Respuesta

55

Lo que usted describe (el flujo principal del programa de reanudar de inmediato, mientras que otra función ejecuta) no es lo que normalmente se llama "asíncrono" programación (También conocido como "eventos"), sino más bien "multitarea" (AKA "multihilo" o "multiproceso"). Puede obtener lo que describió con los módulos de biblioteca estándar threading y multiprocessing (este último permite la ejecución simultánea real en máquinas de múltiples núcleos).

asíncrono de programación (event-driven) se apoya en la biblioteca estándar de Python en los módulos asyncore y asynchat, que están muy orientadas a tareas de red (de hecho se utilizan internamente el módulo select, que, en Windows, sólo es compatible con tomas - - aunque en sistemas operativos Unixy también puede admitir cualquier descriptor de archivo).

Para una más general (aunque también sobre todo la creación de redes orientada, pero no limitado a que) el apoyo a la programación asíncrona (event-driven), revisar el paquete de twisted de terceros.

+5

+1, nadie más se dio cuenta de que estaba pensando en enhebrar/bifurcar. –

13

Los otros encuestados te están señalando Twisted, que es un marco excelente y muy completo pero, en mi opinión, tiene un diseño muy antiponético. Además, AFAICT, tiene que usar el bucle principal retorcido, que puede ser un problema para usted si ya está utilizando otra cosa que proporciona su propio bucle.

Aquí está un ejemplo artificioso que demostrara mediante el módulo threading:

from threading import Thread 

def background_stuff(): 
    while True: 
    print "I am doing some stuff" 

t = Thread(target=background_stuff) 
t.start() 

# Continue doing some other stuff now 

Sin embargo, en casi todos los casos de utilidad, tendrá que comunicarse entre hilos. Debería consultar synchronization primitives y familiarizarse con el concepto de concurrency y los problemas relacionados.

El módulo threading proporciona muchas de estas primitivas para que las use, si sabe cómo usarlas.

+0

Si bien el multiprocesamiento (y el multihilo) es útil, eso no significa que sea una solución para todo, ni tampoco significa que sea siempre un buen sustituto para la programación basada en eventos que utiliza un ciclo principal. –

19

Buenas noticias todos!

Python 3.4 incluiría la nueva y ambiciosa programación asincrónica implementation!

Actualmente se llama tulip y ya tiene un active following.

Como se describe en PEP 3153: Asynchronous IO support y PEP 3156: Asynchronous IO Support Rebooted:

Las personas que quieren escribir código asíncrono en Python en este momento tiene algunas opciones:

  • asyncore y asynchat;
  • algo a medida, muy probablemente basado en el módulo de selección;
  • usando una biblioteca de terceros, como Twisted o gevent.

Desafortunadamente, cada una de estas opciones tiene sus desventajas, que esta PEP intenta abordar.

A pesar de haber sido parte de la biblioteca estándar de Python durante mucho tiempo, el módulo asyncore adolece de defectos fundamentales derivados de una API inflexible que no resiste las expectativas de un módulo de red asíncrono moderno.

Además, su enfoque es demasiado simplista para proporcionar a los desarrolladores todas las herramientas que necesitan para explotar al máximo el potencial de las redes asincrónicas.

La solución más popular en este momento utilizada en la producción implica el uso de bibliotecas de terceros. A menudo, estas soluciones proporcionan soluciones satisfactorias, pero existe una falta de compatibilidad entre estas bibliotecas, lo que tiende a hacer que las bases de código estén estrechamente relacionadas con la biblioteca que utilizan.

Esta falta actual de portabilidad entre diferentes bibliotecas IO asíncronas causa un gran esfuerzo duplicado para los desarrolladores de biblioteca de terceros. Una abstracción lo suficientemente poderosa podría significar que el código asincrónico se escribe una vez, pero se usa en todas partes.

Aquí está el brief overview de sus capacidades.

+0

Suena loco que alguien realmente quiera implementar una forma útil de hacer programación asíncrona en Python. –

+0

@ PavelŠimerda: ¿por qué? – MestreLion

+0

@MestreLion: esta área ha sido ignorada durante tanto tiempo. –

Cuestiones relacionadas