Я собираю некоторые данные с первых страниц списка доменов сайта. Некоторые из них не отвечают или работают очень медленно, что приводит к остановке скребка.
Я хотел решить эту проблему, используя тайм-аут. Различные доступные библиотеки HTTP, кажется, не поддерживают это, но System.Timeout.timeout, кажется, делает то, что мне нужно.
Действительно, кажется, что он работает нормально, когда я тестирую функцию очистки, но он вылетает, как только я запускаю включающую функцию: (Извините за плохой / уродливый код. Я учусь.)
fetchPage domain =
-- Try to read the file from disk.
catch
(System.IO.Strict.readFile $ "page cache/" ++ domain)
(\e -> downloadAndCachePage domain)
downloadAndCachePage domain =
catch
(do
-- Failed, so try to download it.
-- This craches when called by fetchPage, but works fine when called from directly.
maybePage <- timeout 5000000 (simpleHTTP (getRequest ("http://www." ++ domain)) >>= getResponseBody)
let page = fromMaybe "" maybePage
-- This mostly works, but wont timeout if the domain is slow. (lswb.com.cn)
-- page <- (simpleHTTP (getRequest ("http://www." ++ domain)) >>= getResponseBody)
-- Cache it.
writeFile ("page cache/" ++ domain) page
return page)
(\e -> catch
(do
-- Failed, so just fuggeddaboudit.
writeFile ("page cache/" ++ domain) ""
return "")
(\e -> return "")) -- Failed BIG, so just don't give a crap.
downloadAndCachePage прекрасно работает с таймаутом при вызове из repl, но fetchPage вылетает. Если я удаляю тайм-аут из downloadAndCachePage, fetchPage будет работать.
Кто-нибудь, кто может объяснить это или знает альтернативное решение?