load_balanced_mode()中IPython.parallel中的阻塞和非阻塞模式有什么区别?

时间:2014-10-28 06:53:16

标签: python multiprocessing ipython ipython-parallel

在我为ipython发现的所有例子中:

似乎在使用负载均衡视图块时设置为False。

我想知道为什么?

此外,是否可以将其设置为True以及具有什么含义?

我知道这可能是一个基本问题,但作为新手,我找不到满意的答案。

感谢帮助

1 个答案:

答案 0 :(得分:0)

看到东西是阻塞的,非阻塞只是获得输出的两种不同方式 - >

  1. 您要么最后输出所有命令,以便处理器将用于执行算法命令而不是产生输出,因为此处理器需要阻止其他命令,此模式称为阻止模式,我们必须在其中设置directViewName.block = TRUE

  2. 或者您希望在为此生成输出后立即指定处理器,它不应该阻止命令,即directViewName.block = FALSE 此模式为非阻止模式。

  3. 现在,如果您在非阻止模式下设置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)
      }
    

    我希望这会对你有所帮助。