El mejor tutorial de Python multiproceso en 2024. En este tutorial podrás aprender Empieza a aprender hilos Python,módulo threading,Threading de utilizar el módulo para crear hilos,sincronización hilo,cola de prioridad de subprocesos (cola),
Múltiples hilos ejecutados simultáneamente es similar a un número de diferentes programas, el funcionamiento multiproceso tiene las siguientes ventajas:
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.
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:
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.
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:
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:
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
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"
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:
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