shad-go/dupcall/README.md
2022-04-02 10:57:00 +00:00

1.7 KiB
Raw Permalink Blame History

dupcall

В этом задании нужно реализовать свою вариацию на тему singleflight. Использовать в реализации singleflight нельзя.

Объект dupcall.Call должен дедуплицировать вызовы дорогой функции, правильно обрабатывая отмену контекста.

Клиенты вызывают метод Do из разных горутин, передавая внутрь cb который они хотят запустить. cb запускается в отдельной горутине и в отдельном контексте.

В один момент времени должен быть запущен только один не отменённый cb. Клиент вызвавший Do должен получить результатом пару result interface{}, err error от того cb, который был запущен в момент вызова Do (но не обязательно от своего cb).

При этом вызов Do может быть отменён через ctx. Отменённый вызов Do должен завершаться сразу. Бегущий внутри cb должен отменяться только в случае, если все ждущие вызовы Do были отменены.

Например, если две горутины сделали вызов Do, а потом первый вызов был отменён, cb должен добежать успешно и вторая горутина должна получить его результат.