Latest web development tutorials

Python multiproceso

Múltiples hilos ejecutados simultáneamente es similar a un número de diferentes programas, el funcionamiento multiproceso tiene las siguientes ventajas:

  • Utilizando hilos pueden ocupar mucho tiempo en el programa de tarea en el fondo de tratar.
  • La interfaz de usuario puede ser más atractivo, así que por ejemplo el usuario hace clic en un botón para accionar una cierta manipulación de eventos, puede estallar una barra de progreso para mostrar el progreso del proceso de
  • La velocidad de carrera podría acelerar
  • En realizado algunas tareas, tales como la espera de la entrada del usuario, la alfabetización de documentos y la red para enviar y recibir datos, el hilo es más útil. En este caso, se puede liberar algunos recursos valiosos, tales como el uso de memoria y así sucesivamente.

Temas en el proceso de implementación y el proceso es diferente. Cada uno tiene un hilo independiente que ejecute la entrada, la salida y la secuencia de los procedimientos para la ejecución de la orden. Sin embargo, el hilo no es capaz de realizar de forma independiente, debe existir según la aplicación, proporcionando múltiples hilos de ejecución controlados por la aplicación.

Cada hilo tiene su propio conjunto de registros de la CPU, llamado el contexto de la rosca, el contexto hilo refleja la última ejecución del estado de rosca registro de la CPU.

indicador de instrucción y el puntero de pila registros son los dos más importantes registros de contexto hilo, el hilo siempre se ejecute en el contexto del proceso, estas direcciones se utiliza para marcar el proceso que posee el hilo de espacio de direcciones de memoria.

  • Hilo pueda ser substituida (interrumpe).
  • En otros hilos se están ejecutando, el hilo se puede mantener en suspenso (también conocido como el sueño) - este es el hilo conductor de las concesiones.

Empieza a aprender hilos Python

hilos de Python utilizan de dos formas: con una función o clases para ajustar el objeto hilo.

Funcional: la función que llama módulo de hilo start_new_thread () para generar un nuevo hilo. La sintaxis es la siguiente:

thread.start_new_thread ( function, args[, kwargs] )

Descripción de parámetros:

  • - Función hilo.
  • args - los parámetros de hilos pasados ​​a la función, que debe ser un tipo tupla.
  • kwargs - opcionales.

Ejemplo:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import thread
import time

# 为线程定义一个函数
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print "%s: %s" % ( threadName, time.ctime(time.time()) )

# 创建两个线程
try:
   thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print "Error: unable to start thread"

while 1:
   pass

Los resultados de la salida programa anterior son los siguientes:

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

El extremo del hilo es por lo general se basan en el final natural de la función del hilo; también puede llamar thread.exit función del hilo (), se genera una excepción SystemExit, lograr el propósito de salir hilo.


módulo threading

Python proporciona soporte para enhebrar a través de dos bibliotecas estándar de rosca y con hilo. hilo proporciona un nivel bajo, el hilo original y una cerradura simple.

Otros métodos módulo de hilo proporciona:

  • threading.currentThread (): Devuelve la variable hilo actual.
  • threading.enumerate (): Devuelve una lista contiene hilo conductor. Se refiere corriendo hilo comenzó antes del final, que no incluye el hilo antes de comenzar y después de la terminación.
  • threading.activeCount (): Devuelve el número de subprocesos que se ejecutan, y len (threading.enumerate ()) tienen el mismo resultado.

Además de la utilización de métodos, módulo threading también proporciona una clase de rosca para manejar el hilo, clase Thread proporciona los siguientes métodos:

  • ejecutar (): para indicar el método de hebras activas.
  • start (): iniciar actividad de los hilos.

  • join ([hora]): Esperar hasta quese interrumpe el hilo. Esto bloquea el subproceso de llamada hasta que el método de la rosca join () se llama suspensión - salida normal o lanzar una excepción no controlada - o tiempo de espera se produce opcional.
  • isAlive (): Devuelve el hilo está activo.
  • getName (): Devuelve el nombre del hilo.
  • setName (): Establecer el nombre del hilo.

Threading de utilizar el módulo para crear hilos

Utilizar el módulo de roscado para crear un hilo, directamente heredado de threading.Thread, a continuación, anular __init__ método y ejecutar métodos:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import threading
import time

exitFlag = 0

class myThread (threading.Thread):   #继承父类threading.Thread
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):                   #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 
        print "Starting " + self.name
        print_time(self.name, self.counter, 5)
        print "Exiting " + self.name

def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            thread.exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1

# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# 开启线程
thread1.start()
thread2.start()

print "Exiting Main Thread"

Los resultados de la ejecución del programa anterior son los siguientes;

Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Thu Mar 21 09:10:03 2013
Thread-1: Thu Mar 21 09:10:04 2013
Thread-2: Thu Mar 21 09:10:04 2013
Thread-1: Thu Mar 21 09:10:05 2013
Thread-1: Thu Mar 21 09:10:06 2013
Thread-2: Thu Mar 21 09:10:06 2013
Thread-1: Thu Mar 21 09:10:07 2013
Exiting Thread-1
Thread-2: Thu Mar 21 09:10:08 2013
Thread-2: Thu Mar 21 09:10:10 2013
Thread-2: Thu Mar 21 09:10:12 2013
Exiting Thread-2

sincronización hilo

Si varios hilos de una modificación de datos común, se pueden producir resultados imprevisibles, con el fin de garantizar la exactitud de los datos, es necesario sincronizar múltiples hilos.

objeto hilo mediante el bloqueo y RLOCK puede lograr una sincronización simple hilo, los dos objetos han de adquirir métodos y métodos de liberación, para aquellos que necesitan cada uno permitiendo sólo un hilo datos de funcionamiento, se puede colocar en funcionamiento adquirir y liberar métodos de la habitación. En la siguiente manera:

Multithreading ventaja es que puede ejecutar simultáneamente varias tareas (al menos se siente como esto). Pero cuando las discusiones necesitan compartir datos, puede que no haya problemas de sincronización de datos.

Consideremos un caso: una lista de todos los elementos son cero, el hilo "conjunto" de atrás hacia adelante todos los elementos en una sola, y el hilo de "impresión" de adelante hacia atrás el encargado de leer la lista y de impresión.

A continuación, el hilo podría ser "ajustado" empezó a cambiar cuando la "impresión" hilo para imprimir una lista, sería la mitad de la potencia de la mitad de un 0, que se no se sincroniza los datos. Para evitar esta situación, se introduce el concepto de la cerradura.

Cerradura tiene dos estados - bloqueado y desbloqueado. Cada vez que un hilo como "set" para acceder a los datos compartidos, primero debe obtener el bloqueo; si ya tiene otro hilo, tales como "impresión" para obtener encerrado, y luego dejar que el hilo "set" de pausa, que es el bloqueo sincrónica; espere hasta que el hilo " imprimir "el acceso se ha completado, después de la liberación de la cerradura, dejar que el hilo" set "para continuar.

Después de este proceso, al imprimir una lista de todas las salidas de 0 o 1 salida completa, ya no aparece la mitad vergüenza 0 1 medio.

Ejemplo:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import threading
import time

class 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 "Starting " + self.name
       # 获得锁,成功获得锁定后返回True
       # 可选的timeout参数不填时将一直阻塞直到获得锁定
       # 否则超时后将返回False
        threadLock.acquire()
        print_time(self.name, self.counter, 3)
        # 释放锁
        threadLock.release()

def print_time(threadName, delay, counter):
    while counter:
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1

threadLock = threading.Lock()
threads = []

# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# 开启新线程
thread1.start()
thread2.start()

# 添加线程到线程列表
threads.append(thread1)
threads.append(thread2)

# 等待所有线程完成
for t in threads:
    t.join()
print "Exiting Main Thread"

cola de prioridad de subprocesos (cola)

módulo de cola de Python proporciona sincronización, clases de cola compatibles con el proceso, incluyendo FIFO (First In First Out) Cola de cola, LIFO (último en entrar, primero en salir) LifoQueue cola y PriorityQueue cola de prioridad. Estas colas se implementan bloquean primitivas se pueden utilizar directamente en varios subprocesos. Puede utilizar la cola para conseguir la sincronización entre hilos.

Módulo de cola de métodos comúnmente utilizados:

  • Queue.qsize () devuelve el tamaño de la cola
  • Queue.empty () si la cola está vacía, devuelve True, False y viceversa
  • Queue.full () Si la cola está llena, devuelven verdadero, falso y viceversa
  • En correspondencia con el tamaño y maxsize Queue.full
  • Queue.get ([bloque [, tiempo de espera]]) Obtiene la cola, el tiempo de espera de tiempo de espera
  • Queue.get_nowait () en lugar Queue.get (Falso)
  • Queue.put (punto) cola de escritura, tiempo de espera de tiempo de espera
  • Queue.put_nowait (punto) bastante Queue.put (tema, False)
  • Queue.task_done () tras la realización de una obra, Queue.task_done () función envía una señal a la tarea se ha completado la cola
  • Queue.join () significa en realidad hasta que la cola está vacía, a continuación, realizar otras operaciones

Ejemplo:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import Queue
import threading
import time

exitFlag = 0

class 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 "Starting " + self.name
        process_data(self.name, self.q)
        print "Exiting " + self.name

def process_data(threadName, q):
    while not exitFlag:
        queueLock.acquire()
        if not workQueue.empty():
            data = q.get()
            queueLock.release()
            print "%s processing %s" % (threadName, data)
        else:
            queueLock.release()
        time.sleep(1)

threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(10)
threads = []
threadID = 1

# 创建新线程
for tName in threadList:
    thread = myThread(threadID, tName, workQueue)
    thread.start()
    threads.append(thread)
    threadID += 1

# 填充队列
queueLock.acquire()
for word in nameList:
    workQueue.put(word)
queueLock.release()

# 等待队列清空
while not workQueue.empty():
    pass

# 通知线程是时候退出
exitFlag = 1

# 等待所有线程完成
for t in threads:
    t.join()
print "Exiting Main Thread"

Los resultados del programa anterior:

Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread