2014-10-28 89 views

回答

0

看到的是阻塞和非阻塞無非是兩種不同的方式來讓你的輸出 - >

  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] 
    } 

非阻塞執行

在非阻塞模式中,應用()提交給要執行的命令,然後立即返回一個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) 
    } 

我希望這會幫助你。

+0

感謝您的有用信息。所以我很好奇的是負載均衡視圖(通常在示例中不是直接使用DirectView編寫爲lview,我只是不明白爲什麼在此之前block始終設置爲false,請您詳細說明一下在你的答案? – evan54 2014-10-28 16:52:03