Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> python

Python - Programación multiproceso

Página anterior Página siguiente

Ejecutar varios subprocesos es similar a ejecutar varios programas diferentes al mismo tiempo, pero con los siguientes beneficios:

  • Varios subprocesos dentro de un proceso comparten el mismo espacio de datos con el subproceso principal y, por lo tanto, pueden compartir información o comunicarse entre sí más fácilmente que si fueran procesos separados.

  • Los subprocesos a veces se denominan procesos ligeros y no requieren mucha sobrecarga de memoria; son más baratos que los procesos.

Un hilo tiene un comienzo, una secuencia de ejecución y una conclusión. Tiene un puntero de instrucción que realiza un seguimiento de dónde se está ejecutando actualmente dentro de su contexto.

  • Se puede adelantar (interrumpir)

  • Se puede poner en espera temporalmente (también conocido como inactivo) mientras se ejecutan otros subprocesos; esto se denomina rendimiento.

Iniciar un hilo nuevo

Para generar otro hilo, debe llamar al siguiente método disponible en hilo módulo -

 thread.start_new_thread (función, args [, kwargs]) 

Esta llamada al método permite una forma rápida y eficiente de crear nuevos subprocesos tanto en Linux como en Windows.

La llamada al método regresa inmediatamente y el hilo secundario comienza y llama a la función con la lista pasada de args . Cuando la función regresa, el hilo termina.

Aquí, argumentos es una tupla de argumentos; use una tupla vacía para llamar a la función sin pasar ningún argumento. kwargs es un diccionario opcional de argumentos de palabras clave.

Ejemplo

 #! / usr / bin / pythonimport threadimport time # Defina una función para el threaddef print_time (threadName, delay):count =0 while count <5:time.sleep (delay) count + =1 print "% s:% s"% (threadName, time.ctime (time.time ())) # Crea dos hilos de la siguiente manera intenta:thread.start_new_thread (print_time, ("Thread-1", 2,)) hilo. start_new_thread (print_time, ("Thread-2", 4,)) excepto:print "Error:no se puede iniciar el hilo" mientras 1:pasa 

Cuando se ejecuta el código anterior, produce el siguiente resultado:

 Thu-1:Thu Jan 22 15:42:17 2009 Thu-1:Thu Jan 22 15:42:19 2009 Thu-2:Thu Jan 22 15:42:19 2009 Thu-1:Thu 22 de enero 15:42:21 2009 Thu-2:Thu 22 de enero 15:42:23 2009 Thu-1:Thu 22 de enero 15:42:23 2009 Thu-1:Thu 22 de enero 15:42:25 2009 Thu-2:Thu 22 de enero 15:42:27 2009 Thread-2:Thu Jan 22 15:42:31 2009 Thu-2:Thu Jan 22 15:42:35 2009 

Aunque es muy eficaz para subprocesos de bajo nivel, el subproceso El módulo es muy limitado en comparación con el módulo de subprocesamiento más nuevo.

El subprocesamiento Módulo

El módulo de subprocesos más nuevo incluido con Python 2.4 proporciona un soporte de alto nivel mucho más poderoso para subprocesos que el módulo de subprocesos discutido en la sección anterior.

El subproceso El módulo expone todos los métodos del hilo módulo y proporciona algunos métodos adicionales -

  • threading.activeCount () - Devuelve el número de objetos de hilo que están activos.

  • threading.currentThread () - Devuelve el número de objetos de hilo en el control de hilo de la persona que llama.

  • threading.enumerate () - Devuelve una lista de todos los objetos de hilo que están actualmente activos.

Además de los métodos, el módulo de subprocesos tiene el Thread clase que implementa subprocesos. Los métodos proporcionados por Thread clase son las siguientes -

  • ejecutar () - El método run () es el punto de entrada para un hilo.

  • inicio () - El método start () inicia un hilo llamando al método run.

  • unirse ([hora]) - El join () espera a que terminen los subprocesos.

  • está vivo () - El método isAlive () comprueba si un hilo todavía se está ejecutando.

  • getName () - El método getName () devuelve el nombre de un hilo.

  • setName () - El método setName () establece el nombre de un hilo.

Creación de subprocesos mediante subprocesos Módulo

Para implementar un nuevo hilo usando el módulo de subprocesos, debe hacer lo siguiente:

  • Definir una nueva subclase del Thread clase.

  • Anula __init __ (self [, args]) método para agregar argumentos adicionales.

  • Luego, anule el método run (self [, args]) para implementar lo que debería hacer el hilo cuando se inicia.

Una vez que haya creado el nuevo hilo subclase, puede crear una instancia de la misma y luego iniciar un nuevo hilo invocando el start () , que a su vez llama a run () método.

Ejemplo

 #! / usr / bin / pythonimport threadingimport timeexitFlag =0class myThread (threading.Thread):def __init __ (self, threadID, name, counter):threading.Thread .__ init __ (self) self. threadID =threadID self.name =name self.counter =counter def run (self):print "Iniciando" + self.name print_time (self.name, 5, self.counter) print "Exiting" + self.namedef print_time (threadName , contador, retraso):while contador:if exitFlag:threadName.exit () time.sleep (delay) print "% s:% s"% (threadName, time.ctime (time.time ())) contador - =1 # Crear nuevo threadsthread1 =myThread (1, "Thread-1", 1) thread2 =myThread (2, "Thread-2", 2) # Iniciar nuevo Threadsthread1.start () thread2.start () imprimir "Salir del hilo principal" 

Cuando se ejecuta el código anterior, produce el siguiente resultado:

 Subproceso de inicio-1Hilo de inicio-2Exiting Thread MainThread-1:Thu Mar 21 09:10:03 2013Thread-1:Thu Mar 21 09:10:04 2013Thread-2:Thu Mar 21 09:10:04 2013 Thread-1:Thu Mar 21 09:10:05 2013 Thu-1:Thu Mar 21 09:10:06 2013Thread-2:Thu Mar 21 09:10:06 2013Thread-1:Thu Mar 21 09:10:07 2013Saliendo del hilo-1Hilo-2:jue 21 de marzo 09:10:08 2013Thread-2:jue. 21 de marzo 09:10:10 2013Thread-2:jueves 21 de marzo 09:10:12 2013 

Sincronización de subprocesos

El módulo de subprocesos proporcionado con Python incluye un mecanismo de bloqueo fácil de implementar que le permite sincronizar subprocesos. Se crea un nuevo bloqueo llamando a Lock () método, que devuelve el nuevo bloqueo.

El adquirir (bloquear) El método del nuevo objeto de bloqueo se utiliza para forzar a que los subprocesos se ejecuten sincrónicamente. El bloqueo opcional El parámetro le permite controlar si el hilo espera para adquirir el bloqueo.

Si bloqueando se establece en 0, el hilo regresa inmediatamente con un valor de 0 si el bloqueo no se puede adquirir y con un 1 si se adquirió el bloqueo. Si el bloqueo se establece en 1, el hilo se bloquea y espera a que se libere el bloqueo.

El release () El método del nuevo objeto de bloqueo se utiliza para liberar el bloqueo cuando ya no es necesario.

Ejemplo

 #! / usr / bin / pythonimport threadingimport timeclass myThread (threading.Thread):def __init __ (self, threadID, name, counter):threading.Thread .__ init __ (self) self.threadID =threadID self.name =nombre self.counter =counter def run (self):print "Iniciando" + self.name # Obtener bloqueo para sincronizar los hilos threadLock.acquire () print_time (self.name, self.counter, 3) # Gratis bloquear para liberar el siguiente hilo threadLock.release () def print_time (threadName, delay, counter):while counter:time.sleep (delay) print "% s:% s"% (threadName, time.ctime (time.time () )) contador - =1threadLock =threading.Lock () threads =[] # Crear nuevo threadsthread1 =myThread (1, "Thread-1", 1) thread2 =myThread (2, "Thread-2", 2) # Empezar nuevo Threadsthread1.start () thread2.start () # Agregar subprocesos a la lista de subprocesos threads.append (thread1) threads.append (thread2) # Espere a que se completen todos los subprocesos para t en los subprocesos:t.join () print "Saliendo del subproceso principal" 

Cuando se ejecuta el código anterior, produce el siguiente resultado:

 Subproceso de inicio-1Hilo de inicio-2Hilo-1:Jueves 21 de marzo 09:11:28 2013Thread-1:Jueves 21 de marzo 09:11:29 2013Thread-1:Jueves 21 de marzo 09:11:30 2013Thread-2:Thu Mar 21 09:11:32 2013Thread-2:Thu Mar 21 09:11:34 2013Thread-2:Thu Mar 21 09:11:36 2013Saliendo del hilo principal 

Cola de prioridad multiproceso

La Cola El módulo le permite crear un nuevo objeto de cola que puede contener un número específico de elementos. Existen los siguientes métodos para controlar la cola:

  • obtener () - El get () elimina y devuelve un elemento de la cola.

  • poner () - El puesto agrega el elemento a una cola.

  • qsize () - El qsize () devuelve el número de elementos que están actualmente en la cola.

  • vacío () - El vacío () devuelve Verdadero si la cola está vacía; de lo contrario, falso.

  • completo () - full () devuelve True si la cola está llena; de lo contrario, falso.

Ejemplo

 #! / usr / bin / pythonimport Queueimport threadingimport timeexitFlag =0class myThread (threading.Thread):def __init __ (self, threadID, name, q):threading.Thread .__ init __ (self) self .threadID =threadID self.name =name self.q =q def run (self):print "Iniciando" + self.name process_data (self.name, self.q) print "Exiting" + self.namedef process_data (threadName, q):while not exitFlag:queueLock.acquire () si no workQueue.empty ():data =q.get () queueLock.release () imprime "% s procesando% s"% (threadName, data) else:queueLock. release () time.sleep (1) threadList =["Thread-1", "Thread-2", "Thread-3"] nameList =["Uno", "Dos", "Tres", "Cuatro", " Five "] queueLock =threading.Lock () workQueue =Queue.Queue (10) threads =[] threadID =1 # Crear nuevos hilos para tName en threadList:thread =myThread (threadID, tName, workQueue) thread.start () hilos. append (hilo) threadID + =1 # Rellena la cola de colaLock.acquire () para la palabra en nameList:workQueue.put (palabra) queueLock.releas e () # Espere a que la cola se vacíe mientras no funcioneQueue.empty ():pass # Notifique a los hilos que es hora de salir xitFlag =1 # Espere a que se completen todos los hilos para t en los hilos:t.join () print "Saliendo del hilo principal" 

Cuando se ejecuta el código anterior, produce el siguiente resultado:

 Subproceso de inicio 1 Procesamiento de subproceso 2 de inicio Procesamiento de subproceso 3 Procesamiento de subproceso 2 Procesamiento de subproceso 2 Procesamiento de subproceso 3 Procesamiento de subproceso 1 Procesamiento de subproceso 2 de salida Cinco subproceso de salida 3 Subproceso de salida 1 Subproceso de salida 2 

python

  1. Promedio de Python:Cómo encontrar el PROMEDIO de una lista en Python
  2. Cómo no manejar excepciones en Python
  3. Diccionario Python (Dict):Actualizar, Cmp, Len, Ordenar, Copiar, Elementos, str Ejemplo
  4. Python - Tipos de variables
  5. Arreglos de Python:Crear, Revertir, Pop con Ejemplos de Arreglos de Python
  6. Migrar a Python 3