Python 没有 运行 无限循环功能
Python did not run function with infinite loop
我对 python 还是很陌生。最近,在玩 simpy 模块时,我遇到了 python 解释器的一些奇怪行为。我实现了 .flood() 函数,它应该是模拟的一部分。令我惊讶的是,它里面的调试没有显示在控制台上。这个函数内部有两大块代码,所以我决定删除其中一个(包含 while True: loop)。
print("Starting program")
env = simpy.Environment()
#From now on we assume the nodes to be 0-indexed
#Create two routers we will connect manually
routers = [Router(env, i, debug = True) for i in range(3)]
# Create wire connection between routers
for i in range(2):
addConnection(env, routers[i], routers[i + 1])
for router in routers:
print("Line above .flood() call")
router.flood()
env.run(until = 100)
def flood(self):
print(f"beginning to flood at {self.env.now}")
for wire in self.out_wire:
wire.put(Packet(self.env.now,
random.randint(1, 10**9),
{"node": self.id, "neigh":self.neighbors}))
while True:
processes = [nei.get() for nei in self.in_wire]
res = yield simpy.events.AnyOf(self.env, processes)
print("RESULT: ", res, f"current time is {self.env.now}")
for packet in res:
print(packet)
运行 此代码生成:
Starting program
Line above .flood() call
Line above .flood() call
Line above .flood() call
当我注释while True:部分时,则输出如下:
Starting program
Line above .flood() call
beginning to flood at 0
Line above .flood() call
beginning to flood at 0
Line above .flood() call
beginning to flood at 0
现在我想知道我做错了什么?我知道,我的模拟仍然无法正常工作,可能我在那里做的事情不太聪明,但除此之外有没有人见过类似的东西?
所以我想如果 self.in_wire 在
中是空的
processes = [nei.get() for nei in self.in_wire]
那么进程将是空的,因此没有事件可以产生,也没有资源可以打印。没有 yield 意味着你的无限循环不会 stop/pause 阻塞你的代码。
您可以通过在循环底部添加一个 yield env.timeout(1)
来测试这个理论
我对 python 还是很陌生。最近,在玩 simpy 模块时,我遇到了 python 解释器的一些奇怪行为。我实现了 .flood() 函数,它应该是模拟的一部分。令我惊讶的是,它里面的调试没有显示在控制台上。这个函数内部有两大块代码,所以我决定删除其中一个(包含 while True: loop)。
print("Starting program")
env = simpy.Environment()
#From now on we assume the nodes to be 0-indexed
#Create two routers we will connect manually
routers = [Router(env, i, debug = True) for i in range(3)]
# Create wire connection between routers
for i in range(2):
addConnection(env, routers[i], routers[i + 1])
for router in routers:
print("Line above .flood() call")
router.flood()
env.run(until = 100)
def flood(self):
print(f"beginning to flood at {self.env.now}")
for wire in self.out_wire:
wire.put(Packet(self.env.now,
random.randint(1, 10**9),
{"node": self.id, "neigh":self.neighbors}))
while True:
processes = [nei.get() for nei in self.in_wire]
res = yield simpy.events.AnyOf(self.env, processes)
print("RESULT: ", res, f"current time is {self.env.now}")
for packet in res:
print(packet)
运行 此代码生成:
Starting program
Line above .flood() call
Line above .flood() call
Line above .flood() call
当我注释while True:部分时,则输出如下:
Starting program
Line above .flood() call
beginning to flood at 0
Line above .flood() call
beginning to flood at 0
Line above .flood() call
beginning to flood at 0
现在我想知道我做错了什么?我知道,我的模拟仍然无法正常工作,可能我在那里做的事情不太聪明,但除此之外有没有人见过类似的东西?
所以我想如果 self.in_wire 在
中是空的processes = [nei.get() for nei in self.in_wire]
那么进程将是空的,因此没有事件可以产生,也没有资源可以打印。没有 yield 意味着你的无限循环不会 stop/pause 阻塞你的代码。
您可以通过在循环底部添加一个 yield env.timeout(1)
来测试这个理论