.. | ||
dupcall.go | ||
dupcall_test.go | ||
README.md |
dupcall
В этом задании нужно реализовать свою вариацию на тему singleflight. Использовать в реализации singleflight нельзя.
Объект dupcall.Call
должен дедуплицировать вызовы дорогой функции, правильно обрабатывая отмену контекста.
Клиенты вызывают метод Do
из разных горутин, передавая внутрь cb
который они хотят запустить. cb
запускается
в отдельной горутине и в отдельном контексте.
В один момент времени должен быть запущен только один не отменённый cb
. Клиент вызвавший Do
должен получить результатом
пару result interface{}, err error
от того cb
, который был запущен в момент вызова Do
(но не обязательно
от своего cb
).
При этом вызов Do
может быть отменён через ctx
. Отменённый вызов Do
должен завершаться сразу. Бегущий внутри
cb
должен отменяться только в случае, если все ждущие вызовы Do
были отменены.
Например, если две горутины сделали вызов Do
, а потом первый вызов был отменён, cb
должен добежать успешно и вторая горутина
должна получить его результат.