作为使用Python中的面向对象编程的小型项目的一部分。我曾尝试为计算集群制作一个简单的设置/模拟程序。集群由一组机架组成,每个机架每个包含12个节点。我几乎已经完成了该程序,尽管我正努力了解为什么会发生这种情况以及如何解决它。
整个程序跨越三个类,一个节点,一个机架和一个集群。
我在这里试图做的是创建一个方法来检查机架是否已满(完全包含12个节点),如果是,则创建一个新的机架实例,然后用最新的机架实例填充节点。
这是集群的相关代码
class Cluster:
def __init__(self, nodesPerRack, racks=[]):
self.nodesPerRack = nodesPerRack
self.racks = racks
def addNode(self, node):
if len(self.racks) == 0:
newRack = Rack()
self.racks.append(newRack)
print(len(self.racks))
for i in range(len(self.racks)):
if self.racks[i].getNodes() < self.nodesPerRack:
print("IM ADDING TO A RACK")
self.racks[i].settInn(node)
elif self.racks[i].getNodes() >= self.nodesPerRack:
print("New rack is being made")
newRack = Rack()
newRack.insertInto(node)
self.racks.append(newRack)
如果程序运行了,它似乎什么也没做,我怀疑它会生成无数的Rack实例,或者它会反复检查机架是否有空间(因此要消耗一堆ram?)
我尝试了几种方法,但我开始怀疑它所迭代的范围没有更新,即使添加了新的Rack元素,它也会挂起,这应该更新以下语句>
for i in range(len(self.racks)):
我如何使for循环更新其范围?我尝试过使用以下方法使用while循环
i = 0
while i < self.nodesPerRack:
do something
i += 1
它仍然使用与for循环相同的问题。
此外,这里是Rack
class Rack:
def __init__(self, nodes=[]):
self.nodes = nodes
def addTo(self, node):
self.nodes.append(node)
和Node的类
class Node:
def __init__(self, minne, antPros):
self.minne = minne
self.antpros = antPros
这是我用来开始测试的代码
from node import Node
from rack import Rack
from cluster import Cluster
cluster = Cluster(12)
for i in range(0,650):
newNode = Node(64,1)
cluster.addNode(newNode)
for i in range(0,16):
newNode = Node(1024, 2)
cluster.addNode(newNode)
答案 0 :(得分:1)
range(len(self.racks))
在执行该表达式时采用一次长度。 for
循环不会在每次迭代时重新评估该表达式。
您可以通过遍历列表本身来避免整个问题:
for rack in self.racks:
,并使用rack
代替self.racks[i]
。为列表对象创建的迭代器保持连接到列表,并且每次您要求下一个值时,它都会重新检查长度。这意味着在循环内扩展的列表上的for
循环也将迭代额外的元素:
>>> l = [42, 81]
>>> for i in l:
... print(i)
... if i == 42:
... l.append(117)
...
42
81
117
在其他情况下,您可以使用while
循环来每次对计数器的长度进行测试:
i = 0
while i < len(self.racks):
# ...
i += 1
while
会在每次迭代时重新计算表达式:
>>> l = [42, 81]
>>> i = 0
>>> while i < len(l):
... print(l[i])
... if l[i] == 42:
... l.append(117)
... i += 1
...
42
81
117
while
循环对于此任务来说比较麻烦,因为现在您必须手动维护计数器,每次索引到self.racks
列表中,很容易忘记或错过{{1 }}。
答案 1 :(得分:0)
除了马丁(Martijn)的答案外,我不确定是否
<system.web>
<httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true"/>
</system.web>
通过方法名称返回节点的数量。如果返回它们,那我的答案就不重要了。