Управление потоком при блокировке очереди и записи SocketChannel


У меня есть блокирующая очередь, в которой пишут несколько авторов. Я хочу поставить механизм управления транзакциями, где не более, скажем, 50 писателей(или около того) могут писать в секунду. Есть ли способ достичь этого?

Edit 1: аналогичное требование предъявляется и к методу записи SocketChannel. То есть позволить n писателям писать в секунду. Значение n изменяется. Мне не нужно беспокоиться об этом.

Еще одно редактирование: я думаю использовать циклический барьер, который я выпущу & сбрасывать каждую секунду. Я иду в правильном направлении?

2 2

2 ответа:

Я не думаю, что одного семафора для 50 писателей достаточно.

Что вы могли бы сделать, так это, например, иметь пул билетов и механизм, который их выдает. Размер пула позволит вам определить максимальное количество писателей, а механизм, который их выдает, позволит вам контролировать поток.

По существу, поток будет примерно таким:

  1. писатель просит билет. Вы можете использовать семафор для блокировки доступа к другим потокам в то время как wrjter получает билет.
  2. Как только у писателя есть билет, он записывает его в буфер.
  3. писатель возвращает билет (опять же, вы можете использовать семафор для управления доступом к этому разделу, чтобы в любой момент времени писатель либо запрашивал, либо возвращал билет s).

Наконец я смешал два решения, чтобы достичь того, что я хотел. Я использовал ограниченные семафоры, чтобы ограничить писателей в любой момент времени наряду с временным циклическим барьером, который помог мне определить общее количество записей в секунду.