0

ipythonで見つけたすべての例で:

負荷分散ビュー ブロックを使用している場合は False に設定されているようです。

なぜだろう?

また、それをTrueに設定することは可能ですか?それにはどのような意味がありますか?

これは基本的な質問かもしれませんが、初心者として満足のいく答えを見つけることができませんでした.

助けに感謝します

4

1 に答える 1

0

物事がブロッキングであり、非ブロッキングが出力を取得する2つの異なる方法に過ぎないことを確認してください->

  1. プロセッサが出力を生成するのではなく、アルゴリズム コマンドの実行に使用されるように、最後にすべてのコマンドの出力を取得する必要があります。このプロセッサは他のコマンドをブロックする必要があり、このモードはブロッキング モードとして知られています。 directViewName.block=TRUE を設定する

  2. または、出力が生成されたらすぐに出力したい場合は、コマンドをブロックしないようにプロセッサを指定する必要があります。つまり、directViewName.block=FALSE で、このモードは非ブロック モードです。

そして、非ブロッキング モードで directViewName.block=TRUE を設定すると、NBM ではなくなります。

プログラミングの観点 --

実行のブロック

ブロッキング モードでは、DirectView オブジェクト (これらの例では dview と呼ばれます) がコマンドをコントローラーに送信し、コントローラーはコマンドを実行のためにエンジンのキューに配置します。その後、apply() 呼び出しは、エンジンがコマンドの実行を完了するまでブロックします。

   {
    In [2]: dview = rc[:] # A DirectView of all engines
    In [3]: dview.block=True
    In [4]: dview['a'] = 5
    In [5]: dview['b'] = 10
    In [6]: dview.apply(lambda x: a+b+x, 27)
    Out[6]: [42, 42, 42, 42]
   }

ノンブロッキング実行

非ブロッキング モードでは、apply() は実行するコマンドを送信し、すぐに AsyncResult オブジェクトを返します。AsyncResult オブジェクトは、後で get() メソッドを使用して結果を取得する方法を提供します。これにより、ローカルの Python/IPython セッションをブロックすることなく、長時間実行されるコマンドをすばやく送信できます。

    {
    In [6]: def wait(t):
    import time
    tic = time.time()
    time.sleep(t)
    return time.time()-tic

   # In non-blocking mode
   In [7]: ar = dview.apply_async(wait, 2)

   # Now block for the result
   In [8]: ar.get()
   Out[8]: [2.0006198883056641, 1.9997570514678955, 1.9996809959411621,2.0003249645233154]

  # Again in non-blocking mode
  In [9]: ar = dview.apply_async(wait, 10)

  # Poll to see if the result is ready
  In [10]: ar.ready()
  Out[10]: False

  # ask for the result, but wait a maximum of 1 second:
  In [45]: ar.get(1)
  }

これがお役に立てば幸いです。

于 2014-10-28T07:07:31.127 に答える