Pythonでオブジェクト指向プログラミングを使用する小さなプロジェクトの一部として。コンピューティングクラスター用の簡単なセットアップ/シミュレーションプログラムを作成してみました。クラスターはラックのセットで構成され、各ラックはそれぞれ12ノードで構成されます。なぜこれが起こるのか、そしてそれをどのように解決するのかを理解するのに苦労していますが、私はプログラムをほぼ終了しました。
プログラム全体は、ノード、ラック、クラスターの3つのクラスにまたがっています。
ここで私がやろうとしているのは、ラックがいっぱいかどうかをチェックするメソッドを作成することです(いっぱいになると、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)
およびノードのクラス
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)
range(len(self.racks))
その式を実行するときに、長さを1回取ります。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
リストたびに、それは忘れたり欠場するのは簡単ですi += 1
終わり。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加