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