A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/pytransitions/transitions/issues/459 below:

Race condition when using AsyncTimeout · Issue #459 · pytransitions/transitions · GitHub

Consider the following example:

import asyncio

from transitions.extensions.asyncio import AsyncMachine, AsyncTimeout
from transitions.extensions.states import add_state_features


@add_state_features(AsyncTimeout)
class CustomMachine(AsyncMachine):
    pass


class Model:
    async def on_enter_completed(self):
        print('entered completed state')
    
    async def on_enter_waiting(self):
        print('entered waiting state')


async def main():
    model = Model()

    states = [
        'start', 
        { 'name': 'waiting', 'timeout': 0.5, 'on_timeout': 'to_waiting' },
        'completed',
    ]
    machine = CustomMachine(model, states, initial='start')
    machine.add_transition('wait', 'start', 'waiting')
    machine.add_transition('complete', 'waiting', 'completed')

    await model.wait()
    await asyncio.sleep(1.0)
    await model.complete()


loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()
loop.close()

The intended behavior is for it to loop on the waiting state a few times, then transition to the completed state and stop. However, the output looks like this:

entered waiting state
entered waiting state
entered completed state
entered waiting state
entered waiting state
entered waiting state
entered waiting state
[...repeats forever...]

It seems that the timer that transitions back to the waiting state does not get properly canceled when we transition to the completed state.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4