2020-02-14 23:01:42 +00:00
|
|
|
|
# batcher
|
|
|
|
|
|
|
|
|
|
`*slow.Value` - это аналог `atomic.Value`, с двумя ограничениями:
|
|
|
|
|
- Вызов `Load()` всегда занимает не меньше 1ms
|
|
|
|
|
- Нельзя делать больше одного вызова `Load()` в один момент времени.
|
|
|
|
|
|
|
|
|
|
Реализуйте `*Batcher`, который оборачивает `*slow.Value` и ускоряет чтения за счёт батчинга.
|
|
|
|
|
|
|
|
|
|
Например, если 1000 горутин одновременно сделают вызов `(*Batcher).Load()`, то можно прочитать
|
|
|
|
|
значение один раз и раздать всем ожидающим горутинам. Это будет в 1000 раз быстрее,
|
2020-02-14 23:26:44 +00:00
|
|
|
|
чем вызвать `(*slow.Value).Load()` напрямую в каждой горутине.
|
2020-02-14 23:01:42 +00:00
|
|
|
|
|
|
|
|
|
Ваша реализация не должна создавать _stale read_. Тоесть, `Load()` всегда должен возвращать значение
|
2020-02-14 23:26:44 +00:00
|
|
|
|
не старее последнего `Store()` на момент начала вызова `Load()`.
|