Четвърта задача

  1. Публикувана е четвърта задача за домашно. Ще ви е много полезно предварително да прочетете този гайд. Условието, както и малък тест, могат да бъдат намерени и в github хранилището ни.

    Тук можете да ни питате ако има нещо неясно по условието.

  2. Пропуснали сте да имплементирате в тестовете okSetResult ^^ (:24 setResult: okSetResult,)

    edit: Ии ако може малко пояснение за следното:

    // Нови заявки не трябва да бъдат започвани през това време,
    нито ако вече започнати равни на тях да бъдат добавяни за извиквани на `SetResult`.
    

    (обяснението на метода Stop() от интерфейса Requester)

  3. @Даниел: Благодаря, добавих го.

    Не съм сигурен кое не е ясно, но ще пробвам с други думи:

    Тъй като Stop изчаква довършването на вече започнати заявки преди да върне(предишната част от коментара), то връщането може да отнеме време.

    През това време, от извикването на Stop до връщането, AddRequest трябва да прави нищо.

    Разбира се след връщането на Stop, Requester е (surprise) спрян. Тоест от извикването на Stop нататък AddRequest прави нищо.

  4. Не, че ще променя нещо, но намирам пускането на задача между Коледа и Нова година за доста нелепа идея. Мисля, че за толкова време без задача можеше да се изчака още една седмица.

    Държах просто да си изкажа мнението си, без лоши чуства.

    Весели празници!

  5. "// Спира 'Заявчика'. Това означава, че изчаква всички вече започнали заявки да завършат ....."

    Какво точно се има предвим под "вече започнали заявки"? 1. Такива, които са добавени с AddRequest 2. Такива, които са добавени с AddRequest и им е извикан Run метода

  6. @Катя

    2 - такива на които Run е бил вече извикан и все още не е завършил.

    Голям пример:

    Имайки

    r1, r2, r3, r4, r5, r6, r7 са Request-и
    r1.ID() == r2.ID() == r3.ID()
    r4.ID() == r5.ID()
    r1.ID() != r4.ID()
    r6.ID() != r1.ID() и r6.ID() != r4.ID() и r6.ID() != r7.ID()
    r7.ID() != r1.ID() и r7.ID() != r4.ID() и r7.ID() != r6.ID()
    r1.Cacheable() == r2.Cacheable() == r3.Cacheable() == true
    r4.Cacheable() == r5.Cacheable() == false
    Requester със throttle 2 и cacheSize 1000
    

    Последователни събития във времето:

    1. r1, r2, r4, r5 и r6 са били addRequest-нати
    2. r1 влиза преди r2, следователно r2 ще изчака r1 да завърши и да се види дали е Cacheable и евентуално да му се вземе резултата.
    3. r4 влиза преди r5, и аналогичната ситуация.
    4. r6 e влязъл след r1 и r4 (но преди r2 и r5 за да е по забавно), но понеже throttle е 2, r6.Run() не се е извикал все още.
    5. Stop се извиква и блокира.
    6. извиква се AddRequest със r3 и r7, нито един от двата не се добавя, и нищо не се случва като цяло.
    7. r1.Run() завършва, r1.Cacheable() == true и съответно се извиква r2.SetResult.
    8. r4.Run() завършва, r4.Cacheable() == false, съответно r5 трябва да се изпълни, но не се, защото вече е извикан Stop.
    9. Stop връща.

    Забележки:

    • Requester-а няма останали работещи goroutine-и.
    • Стъпки 2 и 3, както и 7 и 8 могат да бъдат разменени една с друга.
    • r7 не се изпълнява защото Requester.Stop() е бил извикан.

    Пропуснал ли съм някой случай?

Трябва да сте влезли в системата, за да може да отговаряте на теми.