Barreras en Python

Es un método de sincronización. Una barrera para un grupo de hilos o procesos significa que todos los que implementen esta barrera deberán parar en ese punto sin poder ejecutar las siguientes líneas de código hasta que todos los restantes hilos/procesos hayan alcanzado esta barrera.

Construcciones barrera clásicas definen el conjunto de procesos / hilos de participar de forma estática. Esto suele hacerse, ya sea al inicio del programa o cuando una barrera como el Pthreads barrera se crea una instancia. Esto restringe las posibles aplicaciones para las que se pueden utilizar barreras.

Apoyar paradigmas de programación más dinámicos como tenedor / unirse paralelismo, los conjuntos de los participantes tienen que ser dinámicos. Por lo tanto, necesita el conjunto de procesos / hilos que participan en una operación de barrera para ser capaz de cambiar con el tiempo. X10 introdujo el concepto de los relojes para tal fin, que proporcionan una barrera dinámica semántica. Sobre la base de los relojes, sincronizadores . Se han propuesto para añadir aún más flexibilidad para la sincronización de barrera. Con sincronizadores es posible expresar dependencias de datos entre los procesos que participan de forma explícita para evitar innecesaria sobre-sincronización.

Barrera (partes [, la acción [, timeout]])

Crear una compartida threading.Barrier objeto y devolver un proxy para ello.

counters = [0, 0]

barrier = threading.Barrier(2)

def count(thread_num, steps):

for i in range(steps):

other = counters[1 – thread_num]

barrier.wait() # wait for reads to complete

counters[thread_num] = other + 1

barrier.wait() # wait for writes to complete

def threaded_count(steps):

other = threading.Thread(target=count, args=(1, steps))

other.start()

count(0, steps)

print(‘counters:’, counters)

threaded_count(10)

En este ejemplo, la lectura y la escritura a los datos compartidos tienen lugar en diferentes fases, separados por barreras. Las escrituras se producen en la misma fase, pero son disjuntos; esta disjunción es necesario para evitar escrituras concurrentes a los mismos datos en la misma fase.Puesto que este código está sincronizada correctamente, ambos contadores siempre serán 10 en el extremo.

La partícula multiproceso simulador utiliza una barrera de una manera similar para sincronizar el acceso a los datos compartidos. En la simulación, cada hilo posee un número de partículas, todos los cuales interactúan entre sí a lo largo de muchos timesteps discretos. Una partícula tiene una posición, velocidad y aceleración, y una nueva aceleración se calcula en cada paso de tiempo basado en las posiciones de las otras partículas. La velocidad de la partícula debe ser actualizado en consecuencia, y su posición de acuerdo con su velocidad.

Al igual que con el simple ejemplo de arriba, hay una fase de lectura, en la que todas las posiciones de las partículas “son leídas por todos los temas. Cada hilo actualiza la aceleración de sus propias partículas ‘en esta fase, pero ya que estas son las escrituras disjuntos, no tiene por qué ser sincronizado. En la fase de escritura, cada hilo actualiza velocidades y posiciones de sus propias partículas. Una vez más, estos son escrituras disjuntos, y están protegidos de la fase de lectura por barreras.

Referencias:

http://composingprograms.com/pages/47-parallel-computing.html

https://docs.python.org/3/library/multiprocessing.html

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s