shad-go/dupcall
2022-04-02 14:44:39 +03:00
..
dupcall.go go fix old build tags. 2022-03-15 23:49:56 +03:00
dupcall_test.go swap expected and actual arguments of require.Equal 2021-03-21 14:54:40 +03:00
README.md Update dupcall/README.md 2022-04-02 10:57:00 +00:00

dupcall

В этом задании нужно реализовать свою вариацию на тему singleflight. Использовать в реализации singleflight нельзя.

Объект dupcall.Call должен дедуплицировать вызовы дорогой функции, правильно обрабатывая отмену контекста.

Клиенты вызывают метод Do из разных горутин, передавая внутрь cb который они хотят запустить. cb запускается в отдельной горутине и в отдельном контексте.

В один момент времени должен быть запущен только один не отменённый cb. Клиент вызвавший Do должен получить результатом пару result interface{}, err error от того cb, который был запущен в момент вызова Do (но не обязательно от своего cb).

При этом вызов Do может быть отменён через ctx. Отменённый вызов Do должен завершаться сразу. Бегущий внутри cb должен отменяться только в случае, если все ждущие вызовы Do были отменены.

Например, если две горутины сделали вызов Do, а потом первый вызов был отменён, cb должен добежать успешно и вторая горутина должна получить его результат.