problema do consumidor / produtor: produção de pausa no consumo lento

Denis Kulagin:

Eu tenho um produtor que lê blocos de texto a partir do disco. Vários consumidores estão fazendo cálculos sobre que blocos.

Gostaria produtor para pausar a leitura de dados a partir do disco se houver mais que n bloqueia a ser calculado sobre.

Tê-la colocado em pseudocódigo para ilustrar o que eu gostaria de alcançar.

// "produceBlocks" reads blocks from disk one by one
// and feeds them to lambda
produceBlocks(block -> {
  // (!) if activeCounter exceeds a THRESHOLD, then pause

  executorService.submit(() -> { 
     activeCounter.incrementAndGet();

     // do some work

     activeCounter.decrementAndGet();
  });
});
Alexei Kaigorodov:

"Eu gostaria produtor para pausar a leitura de dados a partir do disco se houver mais que n blocos actualmente a ser calculado sobre." O descrition tarefa real é um pouco diferente: o produtor, antes de ler dados do disco, deve adquirir uma autorização para fazê-lo . Se o seu produtor é um fio, instalação, em seguida, natural para gerenciar licenças é Semaphore . Initialy que contém n permita. O produtor, para ler um bloco, aguires 1 permit com Semaphore::aquire. Quando o bloco é processado pelo consumidor, consumidor liberta 1 licença com Semaphore::release.

Outra abordagem é combinar blocos e licenças. De forma similar à fila de saída do produtor até ao consumidor, criar uma entrada de bloqueio fila de blocos. Initualy colocar lá n blocos. O produtor, para ler um bloco, em primeiro lugar leva o próximo quarteirão essa fila. Consumidor, depois de manusear um bloco, retorna para a fila de entrada.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=205242&siteId=1
Recomendado
Clasificación