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) 来测试这个理论