shad-go/dupcall/README.md

19 lines
1.7 KiB
Markdown
Raw Normal View History

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