2015-05-27 3 views
4

Я довольно новичок в языке python, пожалуйста, несите меня на этом.State Machine in Python: запустить код в режиме перехода или состояния?

Я хочу запустить две государственные машины в двух отдельных потоках, обмениваясь друг с другом через очередь. Я использовал пакет transitions для создания конечного автомата.

Я понимаю, что все действия/код, который выполняет действия, должны быть заправлены в транзакции.

Эти строки взяты из примера пакета переходов, показывающий, куда поместить код для перехода

# escapades. Because the legal department says so. 
self.machine.add_transition('complete_mission', 'saving the world', 'sweaty', 
         after='update_journal') 
def update_journal(self): 
     """ Dear Diary, today I saved Mr. Whiskers. Again. """ 
     self.kittens_rescued += 1 

Однако, как бы я смотреть свою очередь, когда я достиг состояния, для того, чтобы реагировать на сообщения, отправленные туда, что должно было бы привести к переходу из одного состояния в другое? Исходя из моих основных знаний, я бы ожидал, что код в моем состоянии будет ждать сообщения, которое может вызвать переход, и вызвать переход в следующее состояние.

Мне нужно было бы создать поток внутри конечного автомата, передав объект конечного автомата в качестве аргумента, чтобы иметь возможность запускать переходы.

Я правильно понял этот пакет? Или я использую это неправильно?

ответ

3

Я бы предложил сделать это по-другому. По крайней мере, это должно быть намного легче отлаживать и поддерживать в соответствии с этим предложением, на мой взгляд (объяснение ниже).

  • Во-первых, ваше состояние машины код должен не обновление очереди или слушать очереди непосредственно. Вместо этого следует просто обновить некоторые переменные, например, так:

    next_action = '' 
    
    This is a transition 
    def update_action(self, action): 
        global next_action 
        next_action = action 
    

    (вы, конечно, должны стараться избегать глобальных переменных и работы ОО, но я упрощая, как это не смысл этого ответа).

  • Далее вы должны иметь очереди и состояние машины манипулятором функции, в ведении каждого из потоков:

    while some_condition: 
        get the action from the queue 
        update the state machine 
        obtain the action from next_action 
        push to the queue 
    

Объяснение - вы всегда должны отделить логику кода из системы код. Написание конечного автомата, который не взаимодействует с очередями, потоками и т. Д., Позволяет вам писать код, который намного легче отлаживать и тестировать в модульных тестах. Только после того, как логика работает, вы должны подключить ее к очередям и тому подобное.

+0

Я вижу, я построил свой код, как это, но затем наткнулся на проблему, пытаясь заставить очередь работать двунаправленно и отправлять вещи. Спасибо за помощь! – JoeyD