shad-go/dupcall/README.md

19 lines
1.6 KiB
Markdown
Raw Normal View History

2021-03-18 14:39:31 +00:00
# dupcall
В этом задании нужно реализовать свою вариацию на тему singleflight.
Объект `dupcall.Call` должен дедублицировать вызовы дорогой функции, правильно обрабатывая отмену контекста.
Клиенты вызывают метод `Do` из разных горутин, передавая внутрь `cb` который они хотят запустить. `cb` запускается
в отдельной горутине и в отдельном контексте.
В один момент времени должен быть запущен только один не отменённый `cb`. Клиент вызвавщий `Do` должен получить результатом
пару `result interface{}, err error` от того `cb`, который был запущен в момент вызова `Do` (но не обязательно
от своего `cb`).
При этом вызов `Do` может быть отменён через `ctx`. Отменённый вызов `Do` должен завершаться сразу. Бегущий внутри
`cb` должен отменяться только в случае, если __все__ ждущие вызовы `Do` были отменены.
Например, если две горутины сделали вызов `Do`, а потом первый вызов был отменён, `cb` должен добежать успешно и вторая горутина
должна получить его результат.