赋值本身什么都不做。rc
这是你的客户。Doingrc[0]
或任何类型的索引会生成并返回一个 DirectView 对象,该对象是一个包含您在 [] 中指定的任何引擎的视图。这是生成视图的简写:它实际上不仅仅是获取特定对象。
因此,这些观点并不是唯一的。我认为最好的解释方法是举个例子。假设您有 2 个引擎。您只想在引擎一上运行一些任务,并希望这些任务被阻止。您只想在引擎一上运行其他人,但不希望他们阻塞。您希望在引擎 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] 分配给一个变量,然后使用该变量时,您正在使用一个视图,而不是创建一个新视图。
iPython 与 Numpy 和 Scipy 一样,有很多速记符号,它们不一定完全符合 Python 的习惯用法。对于 [] 和 getitem 尤其如此。一种更纯粹的 Python 编写方式可能是使用更笨拙rc.direct_view(1)
的 ,等等,这将清楚地表明这不仅仅是获取一个项目,而且实际上是在创建一个视图。