Решение на Concurrent Crawling от Александър Деспотов
Към профила на Александър Деспотов
Резултати
- 7 точки от тестове
- 0 бонус точки
- 7 точки общо
- 8 успешни тест(а)
- 3 неуспешни тест(а)
Код
Лог от изпълнението
[/tmp/go-build667833021/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestWithNegativeWorkersCount -test.timeout=120s] PASS ok _/tmp/d20150111-16649-1gskzgy 0.005s [/tmp/go-build338529682/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestWithZeroWorkersCount -test.timeout=120s] --- FAIL: TestWithZeroWorkersCount-2 (1.00 seconds) solution_test.go:43: Test exceeded allowed time of 1 seconds: parameter errors should be immediately returned (workersCount is zero) FAIL exit status 1 FAIL _/tmp/d20150111-16649-1gskzgy 1.005s [/tmp/go-build631691133/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestWithInvalidCallback -test.timeout=120s] --- FAIL: TestWithInvalidCallback-2 (1.00 seconds) solution_test.go:43: Test exceeded allowed time of 1 seconds: parameter errors should be immediately returned (callback is nil) FAIL exit status 1 FAIL _/tmp/d20150111-16649-1gskzgy 1.005s [/tmp/go-build420453648/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestWithNilChannel -test.timeout=120s] PASS ok _/tmp/d20150111-16649-1gskzgy 0.007s [/tmp/go-build709669538/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestWithClosedChannelWhenStarting -test.timeout=120s] PASS ok _/tmp/d20150111-16649-1gskzgy 0.010s [/tmp/go-build324300992/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestWithClosedChannelMidway -test.timeout=120s] PASS ok _/tmp/d20150111-16649-1gskzgy 5.005s [/tmp/go-build023551871/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestWhetherGlobalTimeoutIsHandled -test.timeout=120s] PASS ok _/tmp/d20150111-16649-1gskzgy 15.008s [/tmp/go-build405011957/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestWithLoremIpsum -test.timeout=120s] PASS ok _/tmp/d20150111-16649-1gskzgy 2.008s [/tmp/go-build583313603/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestIfTimeoutAndErrorCodesAreHonoured -test.timeout=120s] --- FAIL: TestIfTimeoutAndErrorCodesAreHonoured-2 (0.00 seconds) solution_test.go:267: Function returned 'http://127.0.0.2:43472/page_with_error_code' when it should have returned 'http://127.0.0.2:43472/correct_page' FAIL exit status 1 FAIL _/tmp/d20150111-16649-1gskzgy 0.006s [/tmp/go-build898738108/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestRaceCondition -test.timeout=120s] PASS ok _/tmp/d20150111-16649-1gskzgy 1.009s [/tmp/go-build634411646/_/tmp/d20150111-16649-1gskzgy/_test/d20150111-16649-1gskzgy.test -test.run=TestCloseChannelBeforeFinish -test.timeout=120s] PASS ok _/tmp/d20150111-16649-1gskzgy 1.006s
История (4 версии и 6 коментара)
Александър обнови решението на 09.12.2014 23:29 (преди над 3 години)
Виж внимателно дали проверяваш правилно за валидни входни параметри.
Също така, какво ще стане ако някой ти подаде валиден отворен канал chunkedUrlsToCheck
, в който обаче никога не се подава стойност? По принцип след 15 секунди трябва да върнеш timeout, но при теб това ще стане ли?
И по какъв начин гарантираш, че веднъж щом си намерил валиден резултат ще го върнеш веднага, а няма да продължиш да "копаеш"? :)
Александър обнови решението на 10.12.2014 11:05 (преди над 3 години)
Добре първите 2 ги оправих, мисля. Достатъчно ли е да провера дали канала е nil ? Последното според моето тълкование на условието е само за бонус точки ?
Да, сега е по-добре. Все още има какво да се оправи по проверките на входните данни, но си оправил проблема с вечното чакане на chunkedUrlsToCheck
канала. Виж условието какво трябва да се случва при затварянето му обаче :)
Частта от условието "всички останали непроверени адреси трябва да се игнорират" е по-скоро задължителна :). Идеята е, че ако вече си намерил валиден адрес, не трябва да пускаш нови worker-и, които да започват да търсят по следващи адреси от канала. Бонус точките са ако спреш самите текущо изпълняващи се паралелни http заявки веднага щом намериш правилния адрес.
Ако правилно разбирам select. В момента който някой върне ок по канала ми за резултат няма да могат да се пуснат нови "работници" ?
Александър обнови решението на 10.12.2014 12:10 (преди над 3 години)
https://golang.org/ref/spec#Select_statements
... If one or more of the communications can proceed, a single one that can proceed is chosen via a uniform pseudo-random selection. ....
Ако вече имаш резултат в канала result и в същото време имаш и стойност в urlsQ, нямаш гаранция кой от двата case-а ще се изпълни.
Да, но това може да измени крайния резултат... За да го оправя трябва да правя някви грозотии (или поне на мене не ми идва на акъл как да стане :) ). ще рискувам и ще го предам така :) Мерси за отделеното време поздрави! :)