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` должен добежать успешно и вторая горутина
|
|
|
|
|
должна получить его результат.
|