При сканировании веб-страниц мне нужно быть осторожным, чтобы не делать слишком много запросов к одному и тому же домену, например, я хочу поставить 1 с между запросами. Насколько я понимаю, важно время между запросами. Поэтому, чтобы ускорить работу, я хочу использовать асинхронные рабочие процессы в F #, идея которых заключается в том, чтобы делать запросы с интервалом в 1 секунду, но избегать блокировки в ожидании ответа на запрос.
let getHtmlPrimitiveAsyncTimer (uri : System.Uri) (timer:int) =
async{
let req = (WebRequest.Create(uri)) :?> HttpWebRequest
req.UserAgent<-"Mozilla"
try
Thread.Sleep(timer)
let! resp = (req.AsyncGetResponse())
Console.WriteLine(uri.AbsoluteUri+" got response")
use stream = resp.GetResponseStream()
use reader = new StreamReader(stream)
let html = reader.ReadToEnd()
return html
with
| _ as ex -> return "Bad Link"
}
Затем я делаю что-то вроде:
let uri1 = System.Uri "http://rue89.com"
let timer = 1000
let jobs = [|for i in 1..10 -> getHtmlPrimitiveAsyncTimer uri1 timer|]
jobs
|> Array.mapi(fun i job -> Console.WriteLine("Starting job "+string i)
Async.StartAsTask(job).Result)
Это нормально? Я очень не уверен в двух вещах: - Работает ли Thread.Sleep для задержки запроса? - Является ли использование StartTask проблемой?
Я новичок (как вы могли заметить) в F# (на самом деле программирование в целом), и все, что связано с потоками, меня пугает :)
Спасибо !!