tutorial make loop how español asyncio async python asynchronous

make - process async python



programación asincrónica en python (6)

¿Hay 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?


¡Buenas noticias para todos!

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

Actualmente se llama tulip y ya tiene un seguimiento activo .

Como se describe en PEP 3153: Soporte de IO asíncrono y PEP 3156: Soporte de IO asíncrono reiniciado :

Las personas que desean escribir código asíncrono en Python en este momento tienen 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 este PEP intenta abordar.

A pesar de haber sido parte de la biblioteca estándar 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 ahora utilizada en 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 bibliotecas 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á la implementation de sus habilidades.


Eche un vistazo aquí:

Programación asincrónica en Python

Una introducción a la programación asíncrona y retorcida

Vale la pena echarle un vistazo:

asyncio (anteriormente Tulip) ha sido registrado en la rama predeterminada de Python

Editado el 14-mar-2018

Hoy Python tiene asyncIO: E / S asincrónicas, bucle de eventos, corutinas y tareas integradas.

Descripción tomada del enlace de arriba:

El módulo asyncIO proporciona infraestructura para escribir código concurrente de un único subproceso mediante corutinas, multiplexación de acceso de E / S sobre sockets y otros recursos, servidores y clientes de red en ejecución, y otras primitivas relacionadas. Aquí hay una lista más detallada de los contenidos del paquete:

  1. un ciclo de evento conectable con varias implementaciones específicas del sistema;
  2. abstracciones de transporte y protocolo (similares a las de Twisted);
  3. soporte concreto para TCP, UDP, SSL, canalizaciones de subprocesos, llamadas retrasadas y otras (algunas pueden depender del sistema);
  4. una clase Future que imita la del módulo concurrent.futures, pero adaptada para su uso con el ciclo de eventos;
  5. corutinas y tareas basadas en el rendimiento de (PEP 380), para ayudar a escribir código concurrente de forma secuencial;
  6. soporte de cancelación para futuros y corutinas;
  7. primitivas de sincronización para usar entre corutinas en un solo hilo, imitando a las del módulo de subprocesamiento;
  8. una interfaz para pasar el trabajo a un grupo de subprocesos, para los momentos en que absolutamente, de manera positiva, tiene que utilizar una biblioteca que realiza bloqueos de llamadas de E / S.

La programación asincrónica es más compleja que la programación clásica "secuencial": consulte la página Desarrollar con asíncio que enumera las trampas comunes y explica cómo evitarlas. Habilite el modo de depuración durante el desarrollo para detectar problemas comunes.

También vale la pena echarle un vistazo:

Una guía de programación asincrónica en Python con asyncIO



Los otros encuestados te señalan Twisted, que es un marco excelente y muy completo, pero en mi opinión tiene un diseño muy poco pionero. 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í hay un ejemplo artificial que demostraría el uso del módulo de 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 útiles, querrá comunicarse entre hilos. Debería estudiar las primitivas de sincronización y familiarizarse con el concepto de concurrency y los problemas relacionados.

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


Puede ver mi herramienta de programación asincrónica de Python: http://www.ideawu.com/blog/2010/08/delegate-in-pythonpython-asynchronous-programming.html

import time, random, sys from delegate import * def proc(a): time.sleep(random.random()) return str(a) def proc_callback(handle, args=None): ret = d.end(handle) d = Delegate() d.init(2) # number of workers handle = d.begin(proc, ''12345'', proc_callback, ''test'') sys.stdin.readline() d.free()


Lo que describes (el flujo principal del programa se reanuda inmediatamente mientras se ejecuta otra función) no es lo que normalmente se llama programación "asíncrona" (AKA "impulsada por eventos") sino "multitarea" (AKA "multithreading" o "multiprocesamiento"). Puede obtener lo que describió con los módulos de biblioteca estándar de threading y multiprocessing (este último permite la ejecución simultánea real en máquinas de varios núcleos).

La programación asincrónica (basada en eventos) es compatible con la biblioteca estándar de Python en los módulos asyncore y asynchat , que están muy orientados a tareas de red (de hecho, usan internamente el módulo select , que, en Windows, solo admite sockets, aunque en Unixy SO también puede admitir cualquier descriptor de archivo).

Para obtener un soporte más general (aunque también orientado principalmente a las redes, pero no limitado a eso) para la programación asincrónica (basada en eventos), consulte el paquete twisted terceros.