我正在玩IPython和远程控制:
in: from IPython Import parallel as p
in: rc=p.client(profile=myprofile)
之间存在行为差异
in: rc[0].block
out: False
in: rc[0].block=True
in: rc[0].block
out: False
和
in: view=rc[0]
in: view.block
out: False
in: view.block=True
in: view.block
out: True
我真的无法理解什么追加?这是为什么 ?什么做分配呢?
答案 0 :(得分:1)
作业本身什么都不做。 rc
这是您的客户。执行rc[0]
或任何类型的索引,会生成并返回一个DirectView对象,该对象是您在[]中指定的任何引擎的视图。这是生成视图的简写:它实际上并不只是获取特定对象。
因此,这些观点并不是唯一的。我想,解释它的最好方法就是举个例子。假设你有2个引擎。您希望仅在引擎1上运行某些任务,并希望阻止任务。您希望仅在引擎1上运行其他人,但不希望它们阻止。您希望在引擎1和2上运行更多,并且不希望它们阻止。然后你可以这样做:
view_1_block = rc[0]
view_1_block.block = True
view_2_noblock = rc[0]
view_2_noblock.block = False
view_3_noblock = rc[[0,1]]
view_3_noblock.block = False
然后,您可以使用它们以您想要的任何方式运行任务,例如
view_1_block.map(lambda x:x**10, range(32)) # blocks, returns results, runs only on 1
view_3_noblock.map(lambda x:x**10, range(32)) # does not block, returns AsyncResult, runs on 1 and 2
这里没有使用真正的魔法。当您运行rc [0]两次时,它会生成两个视图。第二种观点与第一种观点不同。将rc [0]分配给变量,然后使用该变量时,您将使用一个视图,而不是创建一个新视图。
像Numpy和Scipy一样,iPython有很多简写符号,不一定完全适合Python的习语。 []和getitem的情况尤其如此。一种更纯粹的Python编写方式可能是使用更加笨拙的rc.direct_view(1)
,等等,这可以清楚地表明这不仅仅是获取一个项目,而且实际上是在创建一个视图。