2016-06-12 5 views
2

私が理解しているように、JVMには、n + 2スレッド数のcore.async goブロックに利用可能なスレッドプールがあります。nはマシン上のコア数です。core.async goブロック自体がパークしていますか、または「スケジューラ」がありますか?

しかし、多くのgoブロックを同時に1つのスレッドにデプロイすることができます。それぞれは、駐車状態(その計算が進行していないことを意味する)または実行状態(その計算が熱を発生する炉心の周りで鳴っている)のいずれかである。クアッドコアマシンに1000個のブロックがある場合、これらの1000個のブロックのうち最大6個がいつでも実行状態にあると推測します。したがって、他の994ブロックは駐車する必要があります。

フルスレッドはコアにスケジュールされます。 OSスケジューラまたはJVMスーパバイザスレッドによって実行されます。だから、goブロックは駐車状態にどのように出入りしますか?それは、実行中(ブロック)に飽きたときに自分自身をパークするか、ブロックがどのスレッド上で実行され、ラウンドロビンなどのいくつかのスケジューリングアルゴリズムの影響を受けるブロックを決定する「ブロックスケジューラ」として働くスーパバイザスレッドです。

ありがとうございました

+3

'core.async'のチャンネルを' go'マクロを使って作ることができるIOCの "スレッド"と混同していると思います。チャネルは実際には何もしないので、実行中の状態やパーキング状態にはなりません。 –

+1

'core.async'の* goブロック*パークは、駐車操作が使用される特定のポイントにあります。これらは 'core.async'コンパイラがこれらのブロックを駐車できるポイントです。 goブロック内でIO操作をブロックしている場合、それはcore.asyncによって提供される操作の1つではなく、core.asyncのスレッドプール内のスレッドの1つをブロックします。これはTimothy Baldrigeの動画「マクロ内部」(https://www.youtube.com/watch?v=R3PZMIwXN_g)と「パートII」(https://www.youtube.com/watch?)から私が理解したものです。 v = SI7qtuuahhU)。どちらも非常に面白いです。 –

+0

@ user3231690私は質問がチャンネルにではなくブロックになるように質問を更新しました。 –

答えて

2

goマクロはフォーム全体を歩き、駐車する必要のある場所を見つけ、明示的にこれらの場所にスレッドをパークするコールを入れます。されている一般的なものには次のものがありますasync/thread

にちゃん>!

  • 呼び出しに送信ちゃん<!
  • から取って他に行くのブロック
    • スタートこれは、ブロックが関数呼び出しをまたがることができない理由の大きな部分です。コンパイラ/マクロはこれらを正しい場所に配置するためにコードブロック全体を見ることができる必要があります。

  • +0

    潜在的なタイプミス: "関数呼び出し" - > "関数定義" – Davyzhu

    +0

    ありがとうアーサー - これはブロックがIO /ネットワークの処理に最適な場所ではないことを意味します - マクロは、ブロックは戻るためにwebserviceの呼び出しを待っています。 – Zuriar

    +1

    常にそれらのために非同期/スレッドを使用し、あなたの罰金。 (あなたがシステム上のスレッドを使い果たすか、メモリが足りなくなるまで)、毎日dbコールと他のサービスへの呼び出しに使用します。 –

    関連する問題