Varios métodos de subprocesos múltiples en Python
Los recursos críticos son recursos a los que solo puede acceder un subproceso a la vez. Un ejemplo típico es una impresora, a la que solo se puede acceder. por un subproceso a la vez Utilizado por un programa para realizar funciones de impresión, debido a que no puede ser operado por varios subprocesos al mismo tiempo, el código que accede a esta parte del recurso generalmente se denomina sección crítica.
Mecanismo de bloqueo
Clase Lock de Threading, use la función de adquisición de esta clase para agregar un bloqueo y use la función de liberación para desbloquear el bloqueo
importar threadingimport timeclass Num:
p>def __init__(self ):
self.num = 0
self.lock = threading.Lock()Lock() def add(self):
p>self.lock.acquire()# Agregue un candado y bloquee el recurso correspondiente
self.num += 1
num = self.num
self.lock.release()# Desbloquear, dejar el recurso
devolver num
n = Num() clase jdThread(threading .thread):
def __init__(self, item):
threading.Thread.__init__(self)
self.item = elemento def run(self ):
time.sleep(2)
value = n.add()#Agregue num por 1 y genere los datos originales y los datos +1
<. p>imprimir(self.item,value)para el elemento en el rango(5):t = jdThread(item)
t.start()
t.join()# Hacer que los subprocesos se ejecuten uno por uno 12345678910111213141516171819202122232425262728
Cuando un subproceso llama al método adquirir() del candado para adquirir el candado, el candado entra en el estado "bloqueado". Sólo un hilo puede adquirir el bloqueo a la vez. Si otro hilo intenta adquirir el bloqueo, el hilo será "bloqueado", lo que se denomina "bloqueo sincrónico" (consulte Conceptos básicos de subprocesos múltiples).
El bloqueo entra en el estado "desbloqueado" hasta que el hilo propietario del bloqueo llama al método release() del bloqueo para liberarlo. El programador de subprocesos seleccionará uno de los subprocesos de bloqueo sincrónico para adquirir el bloqueo y poner el subproceso en estado de ejecución.
Señales
Las señales también proporcionan métodos de adquisición y liberación. Siempre que se llame al método de adquisición, si el contador interno es mayor que 0, se reducirá en 1; si el contador interno es igual a 0, el subproceso se bloqueará hasta que un subproceso llame al método de liberación para actualizar el contador interno; una posición mayor que 1.
importar subprocesosimportar clase de tiempo Num:
def __init__(self):
self.num = 0
self.sem = subprocesos. Semaphore(value = 3) # Permitir que hasta tres subprocesos accedan a los recursos simultáneamente
def add(self):
self.sem.acquire()# Contador interno sem.acquire( ) # Disminuir el contador interno en 1
self.num += 1
num = self.num
self.sem.release()# Aumentar el contador interno por 1
return num
n = Num() clase jdThread(threading.thread):
def __init__(self,item): p>
threading.self)
self.item = elemento def run(self):
time.sleep(2)
valor = n .add()
imprimir(self.item,value)para el elemento en el rango(100):