Ejecución concurrente
*********************

Los módulos descritos en este capítulo proveen soporte para la
ejecución concurrente de código. La elección de qué herramienta
utilizar depende de la tarea a ejecutar (vinculada a CPU o vinculada a
E/S) y del estilo preferido de desarrollo (multi-tarea cooperativa o
multi-tarea apropiativa). A continuación se muestra un resumen:

* "threading" --- Paralelismo basado en hilos

  * Datos locales del hilo

  * Objetos tipo hilo

  * Objetos tipo *lock*

  * Objetos *Rlock*

  * Objetos condicionales

  * Objetos semáforo

    * Ejemplo de "Semaphore"

  * Objetos de eventos

  * Objetos temporizadores

  * Objetos de barrera

  * Uso de *locks*, condiciones y semáforos en la declaración "with"

* "multiprocessing" --- Paralelismo basado en procesos

  * Introducción

    * La clase "Process"

    * Contextos y métodos de inicio

    * Intercambiando objetos entre procesos

    * Sincronización entre procesos

    * Compartiendo estado entre procesos

    * Usando una piscina de trabajadores (*pool of workers*)

  * Referencia

    * "Process" y excepciones

    * Tuberías (*Pipes*) y Colas (*Queues*)

    * Miscelánea

    * Objetos de conexión *Connection Objects*

    * Primitivas de sincronización (*Synchronization primitives*)

    * Objetos compartidos "ctypes"

      * El módulo "multiprocessing.sharedctypes"

    * Administradores (*Managers*)

      * Administradores customizables (*Customized managers*)

      * Utilizando un administrador remoto

    * Objetos Proxy (*Proxy Objects*)

      * Limpieza (*Cleanup*)

    * Piscinas de procesos (*Process Pools*)

    * Oyentes y Clientes (*Listeners and Clients*)

      * Formatos de dirección (*Address formats*)

    * Llaves de autentificación

    * *Logging*

    * El módulo "multiprocessing.dummy"

  * Pautas de programación

    * Todos los métodos de inicio

    * Los métodos de inicio *spawn* y *forkserver*

  * Ejemplos

* "multiprocessing.shared_memory" ---  Proporciona memoria compartida
  para acceso directo a través de procesos

* El paquete "concurrent"

* "concurrent.futures" --- Lanzamiento de tareas paralelas

  * Objetos Ejecutores

  * ThreadPoolExecutor

    * Ejemplo de ThreadPoolExecutor

  * ProcessPoolExecutor

    * Ejemplo de *ProcessPoolExecutor*

  * Objetos Futuro

  * Funciones del Módulo

  * Clases de Excepciones

* "subprocess" --- Gestión de subprocesos

  * Uso del módulo "subprocess"

    * Argumentos frecuentemente empleados

    * El constructor de Popen

    * Excepciones

  * Consideraciones sobre seguridad

  * Objetos Popen

  * Elementos auxiliares de Popen en Windows

    * Constantes de Windows

  * Antigua API de alto nivel

  * Cómo reemplazar anteriores funciones con el módulo "subprocess"

    * Cómo reemplazar la sustitución de órdenes de **/bin/sh**

    * Cómo remplazar los flujos de la shell

    * Cómo reemplazar "os.system()"

    * Cómo reemplazar la familia "os.spawn"

    * Cómo reemplazar "os.popen()", "os.popen2()", "os.popen3()"

    * Cómo reemplazar las funciones del módulo "popen2"

  * Funciones de llamada a la shell de retrocompatibilidad

  * Notas

    * Cómo convertir una secuencia de argumentos a una cadena en
      Windows

* "sched" --- Eventos del planificador

  * Objetos de "Scheduler"

* "queue" --- clase de cola sincronizada

  * Objetos de la cola

  * Objetos de cola simple

* "contextvars" --- Variables de Contexto

  * Variables de Contexto

  * Gestión de Contexto Manual

  * Soporte *asyncio*

He aquí módulos de apoyo para algunos de los servicios mencionados:

* "_thread" --- API de bajo nivel para manejo de hilos

* "_dummy_thread"--- Remplazo directo para el módulo "_thread"

* "dummy_threading" --- Reemplazo directo para el modulo "threading"
