2
私の目標は、非同期タスク(この場合はURLの取得)を1秒に1回起動することです。 Asyncタスクが3秒かかると、次のように動作します。F#は毎秒新しい非同期要求を生成します
0sec: Start thread 0
1sec: Start thread 1
2sec: Start thread 2
3sec: Start thread 3
3sec: Finish thread 0
4sec: Start thread 4
4sec: Finish thread 1
これまでのコードはここまでです。私の問題をより明確にするために、workTimeとAsync.Sleepコードが追加されました。
let FetchUrlAsync (thread: int) (url: string) =
async {
let req = WebRequest.Create(url)
let! resp = req.AsyncGetResponse()
use stream = resp.GetResponseStream()
use reader = new System.IO.StreamReader(stream)
let workTime = System.Random().Next(5000,8000)
sprintf "start work %i" thread |> Console.WriteLine
do! Async.Sleep workTime
sprintf "end work %i (time taken: %i)" thread workTime |> Console.WriteLine
return reader.ReadToEnd()
}
Seq.initInfinite(fun i -> FetchUrlAsync i "http://www.google.com"
|> Async.StartAsTask
|> ignore
Thread.Sleep 1000
)
|> Seq.iter(id)
問題は、最大2つのスレッドが同時に実行されているようです。なぜこれが起こっているのですか、何が間違っていますか?
また、私はasyncで何かをやっています。
私の例では機能するので投票していますが、私は他の回答を期待しています。 [Microsoftサポート](https://support.microsoft.com/en-us/kb/821268)によると、制限は(12 * CPU数)にする必要があります。私は多くのスレッドが並行して実行される可能性を予想しており、この制限によって妨げられたくないのです。 –
@rebornprogrammer:これは正解です... _you should_(おそらく(多分...))がlimit for CpuN * 12はデフォルト値があり、少なくとも何十年もの間、 '2'であったという単純な事実とは関係がありません。 – ildjarn