0

私はロボティクスのシミュレーションのために simpy をいじっています.ping と pong と呼ばれる 2 つのラケットを使った簡単なピンポン ゲームを書くことから始めました. yield env.timeout(0)1 人のプレーヤーが反対側のプレーヤーに自分のターンをキャッチする機会を提供できるようにするために を追加した場合にのみ、正常に機能します。このヌープ(?)をスキップすると、常に最初のプレーヤーがボールをつかみます。これが私のコードです:

import simpy

ball_wait = 1

def racket(env, name, ball):
    while True:
        # Let the first user catch the ball
        with ball.request() as req:  # Create a waiting resource
            yield req   # Wait and get the ball

            # The time it takes for the ball to arrive. This can
            # be used to plan the strategy of how to hit the ball.
            yield env.timeout(ball_wait)
            print env.now, name

        # "Sleep" to get the other user have his turn.
        yield env.timeout(0)

env = simpy.Environment()
ball = simpy.Resource(env, capacity = 1)

env.process(racket(env, 'Ping', ball))
env.process(racket(env, 'Pong', ball))

env.run(until=10)
print 'Done!'

私の質問は、なぜ必要なのenv.timeout(0)ですか?また、2 つのプロセス間で制御を引き渡す他の (より良い?) 戦略があるのではないかと思います。私も遊んでいましprocess.interrupt()たが、やり過ぎのように思えます。

4

1 に答える 1

1

この問題の解決策は、simpy-users メーリング リストで見つけることができます。

Dov が実際に発見したのは、バージョン 3.0.4 で修正された SimPy のバグでした。

于 2014-04-23T12:29:32.440 に答える