Skip to content

Latest commit

 

History

History

dupcall

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

dupcall

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

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

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

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

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

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