eventlet并发读写socket出现Second simultaneous问题
eventlet绿化和patch原理

实用工具状态机transitions

妙音 posted @ 2020年11月21日 09:42 in python with tags 状态机 , 1317 阅读

说明

 
1. 状态机是一个非常实用的理论。在涉及到复杂的场景,建立状态机模型,能带来极大的方便。比如,网络连接、模型状态、业务逻辑。
 
2. 状态机并不复杂, 重要的是它的思想,能够极大减轻复杂度。使用时关键在于定义好事件和动作。
 
 

 基本概念

 
State: 状态
Event: 事件. 事件触发状态变换
Action: 动作. event发生前或后执行的动作
transition: 变换. 状态变换
 

github

 
https://github.com/pytransitions/transitions
 

安装

 
pip install transitions
 

简单示例

# 连接协议状态机
from transitions.extensions import HierarchicalMachine as Machine
from transitions.extensions.nesting import NestedState

class ConnectionStateMachine:
    """Connection state machine."""

    def __init__(self, callbacks=None):
        """
        :param callbacks: callbacks for the state machine
        """
        self.callbacks = {}

        # 定义状态
        self.states = ["STATE_NOT_CONNECTED",
                       {
                            'name': "STATE_CONNECTED",   # 状态名
                            'on_enter': self._on_enter_CONNECTED,  # 进入状态触发
                            'on_exit': self._on_exit_CONNECTED,    # 退出状态触发
                            'children': [     # 状态嵌套
                                "STATE_NOT_SELECTED",
                                {
                                    'name': "STATE_SELECTED",
                                    'on_enter': self._on_enter_CONNECTED_SELECTED
                                }
                            ]
                       }]

        # transition 1
        self.machine = Machine(model=self, states=self.states, initial="STATE_NOT_CONNECTED", auto_transitions=False)

        if callbacks:
            self.callbacks = callbacks

        # 定义状态变换
        self.machine.add_transition('connect', "STATE_NOT_CONNECTED", "STATE_CONNECTED_NOT_SELECTED")  # transition 2
        self.machine.add_transition('disconnect', "STATE_CONNECTED", "STATE_NOT_CONNECTED")  # transition 3
        self.machine.add_transition('select', "STATE_CONNECTED_NOT_SELECTED", "STATE_CONNECTED_SELECTED")  # transition 4
        self.machine.add_transition('deselect', "STATE_CONNECTED_SELECTED", "STATE_CONNECTED_NOT_SELECTED")  # transition 5
        self.machine.add_transition('timeoutT7', "STATE_CONNECTED_NOT_SELECTED", "STATE_NOT_CONNECTED")  # transition 6

    # 事件触发的动作
    def _on_enter_CONNECTED(self):
        if "on_enter_CONNECTED" in self.callbacks:
            self.callbacks["on_enter_CONNECTED"]()

    def _on_exit_CONNECTED(self):
        if "on_exit_CONNECTED" in self.callbacks:
            self.callbacks["on_exit_CONNECTED"]()

    def _on_enter_CONNECTED_SELECTED(self):
        if "on_enter_CONNECTED_SELECTED" in self.callbacks:
            self.callbacks["on_enter_CONNECTED_SELECTED"]()
 
 
 

定义状态机

 
# 一般都是两种:不嵌套、嵌套
from transitions import Machine   #不嵌套
from transitions.extensions import HierarchicalMachine as Machine # 嵌套

# 检查状态
machine.state
machine.is_<state_name>()
 

定义状态

# 状态可以是三种类型: 对象、字符串、字典
from transitions import State
states = [
    State(name="solid"),    # 对象
    "liquid",               # 字符串
    {"name": "gas"}         # 字典
]
 
 

定义变换

 
# 定义函数
machine.add_transition(trigger, source, dest, )
trigger(str)         方法名,触发状态转换
source(str or list)  源状态
dest(str)            目标状态

# 加上变换
machine.add_transition(trigger="wake_up", source="asleep", dest="hanging out")
machine.add_transition('work_out', 'hanging out', 'hungry')
machine.add_transition('nap', '*', 'asleep')   # 从任意状态变为asleep
 
 

 

Avatar_small
Diane Jones 说:
2020年12月02日 18:32

Find out Reliable and Legit Ways for Extra Income from Home. You are welcome to our scam free world of online earning. legit extra income from home

Avatar_small
Ingríðr Carlu 说:
2020年12月13日 20:13

Punjab National Bank is an Ideal destination for all Banking need, and PNB offer a wide range of personal banking services including loans, credit cards, savings through Internet banking facility, where PNB Netbanking is an important part of the Digital Banking platform for today, and it allows customers to access their account from anywhere and anytime, and PNB net banking is quick and convenient which gives you the liberty of not having to visit the bank branch, and you can avoid those long queues in the branches while saving enormous time and energy. Rajasthan Pay Manager

Avatar_small
<a href="https://top 说:
2020年12月18日 01:11

What a wonderful article, great piece of information. <a href="https://topcoupons.co/xbox-vs-ps4-one-controller-battery-life/">ps4 controller battery life</a>

Avatar_small
LEGEND SEO 说:
2020年12月24日 15:50

Nice blog and absolutely outstanding. You can do something much better but i still say this perfect.Keep trying for the best. casino online canada

Avatar_small
Pak24tv 说:
2020年12月26日 13:15

I am happy to find your distinguished way of writing the post. Now you make it easy for me to understand and implement the concept. Thank you for the post. types of government summary meaning 4 pillars of democracy

Avatar_small
Marjory Wyman 说:
2020年12月29日 15:52

WBCHSE 12th Model Paper 2021 is released by West Bengal Council of Higher Secondary Education in the pdf form. Students appearing for West Bengal 12th Exams 2021 must practice and analyze previous year’s WBCHSE HS question papers as it will help them to become familiar with the exam pattern, marking scheme and the different styles of question that are asked in the paper. While solving the question paper they must keep in mind timing should not exceed the exam time as it will help them in finishing the exam on time. As per the previous year dates probably the exam will be held in February/March 2021. WBCHSE HS 12th Model Paper 2021 WB HS Suggestion West Bengal Council of Higher Secondary School Education WBCHSE Established in the Year 1951. The Board and Headquarters of the Board are Located in Salt Lake City, Kolkata India. WB 12th Suggestion 2021

Avatar_small
Denise Carroll 说:
2020年12月31日 18:26

Wow, What a Excellent post. I really found this to much informatics. It is what i was searching for.I would like to suggest you that please keep sharing such type of info.Thanks anonse transwestytów


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter