Lotesing usando semáforos -- java campo con concurrency camp codereview Relacionados El problema

Batching using semaphores


1
vote

problema

Español

Necesito los mensajes lotes al empujarlos, donde varios hilos hacen la publicación. ¿Qué podría ser una mejor manera de hacer esto?

  private String[] eventArr = new String[100];  private int idx = 0;  private final Semaphore publish = new Semaphore(100, true); private final Semaphore turnstile = new Semaphore(1, true);   public void publish(String data){     try {         boolean acquired = publish.tryAcquire();         if(acquired) {             storeData(data);         }else{             publishToTarget();             publish.acquire();             storeData(data);         }     } catch (InterruptedException e) {         e.printStackTrace();     } }  private void storeData(String data) throws InterruptedException {     turnstile.acquire();     eventArr[idx] = data;     idx++;     turnstile.release(); }  private void publishToTarget() throws InterruptedException {     if(turnstile.tryAcquire()) {         //TODO publish everything here         publish.release(idx);         idx=0;         turnstile.release();     } }   
Original en ingles

I need to batch messages when pushing them, where multiple threads do the publishing. What could be a better way of doing this?

private String[] eventArr = new String[100];  private int idx = 0;  private final Semaphore publish = new Semaphore(100, true); private final Semaphore turnstile = new Semaphore(1, true);   public void publish(String data){     try {         boolean acquired = publish.tryAcquire();         if(acquired) {             storeData(data);         }else{             publishToTarget();             publish.acquire();             storeData(data);         }     } catch (InterruptedException e) {         e.printStackTrace();     } }  private void storeData(String data) throws InterruptedException {     turnstile.acquire();     eventArr[idx] = data;     idx++;     turnstile.release(); }  private void publishToTarget() throws InterruptedException {     if(turnstile.tryAcquire()) {         //TODO publish everything here         publish.release(idx);         idx=0;         turnstile.release();     } } 
     
     
     

Lista de respuestas


Relacionados problema

3  SPSC espera un tampón de anillo libre para mensajes entrantes  ( Spsc wait free ring buffer for incoming messages ) 
Esto es para un solo productor y un solo tampón de anillo de espera libre de consumidores. Las escrituras necesitan ser esperadas por supuesto. Pre-asigna las...

5  Herramienta para calcular el tiempo promedio que toma para una solicitud de tracción GitHub para fusionar  ( Tool to calculate the average time that takes for a github pull request to get m ) 
Estoy aprendiendo, y este es mi primer intento de una herramienta de línea de comandos que usa la API de GitHub para calcular el tiempo promedio que toma una ...

3  Diseño de reutilización de la piscina de hilo con Ejecutors.NewFixedThreadPool en Java  ( Design of thread pool reuse with executors newfixedthreadpool in java ) 
En mi solicitud, tengo código que debería ejecutarse cada hora en un nuevo elemento y ejecutar una operación costosa con MultiPhreading: |2 Mis pregunt...

2  Método de actualización de bloqueo de reentrantreadwritelock  ( Reentrantreadwritelock lock upgrade method ) 
Tengo una pregunta sobre la actualización de bloqueo. Específicamente lo que me molesta está entre readlock.unlock () y siguiendo a writelock.lock () ... Esto...

3  Implementando una fábrica segura de hilo con almacenamiento en caché  ( Implementing a thread safe factory with caching ) 
Tengo un 9988776655544330 que crea Connector Objetos basados ​​en parámetros como URL, nombre de usuario y contraseñas. El Connector2 El objeto implem...

4  Cola de tareas paralelas que se ejecuta en secuencia  ( Parallel task queue that runs in sequence ) 
Necesito una solución que ejecute solicitudes entrantes constantemente en una secuencia por recurso, pero paralela en general. El caso de uso: Muchos clie...

7  Descarga concurrente en Go  ( Concurrent download in go ) 
Escribí un programa para descargar archivos en manera concurrente / paralelo (gomaxprocs & gt; 1). Este es mi programa 2 nd (no juguete) escrito en Go. Po...

12  Entrevista de concurrencia  ( Concurrency interview ) 
Un poco de vuelta, tuve una entrevista donde plantearon un problema, en resumen: Mire un determinado directorio, y procese archivos JSON entrantes Estos ...

4  Pruebe una actualización especulativa, concurrente, libre de bloqueo y atómica hasta que las coincidencias de la condición de aburtar  ( Try a speculative concurrent lock free atomic update until abort condition ma ) 
Por favor, hágamelo saber si ve las mejoras de rendimiento, errores o cualquier cosa que cambie y por qué. public static bool TrySpeculativeUpdate(ref ...

6  Al leer simultáneamente un mapa, mientras que un solo hilo de fondo lo modifica regularmente  ( Concurrently reading a map while a single background thread regularly modifies i ) 
Tengo una clase en la que estoy poblando un mapa liveSocketsByDatacenter desde una sola hilo de fondo cada 30 segundos dentro 9988777665544334 y luego ten...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos