python模拟进程状态

我在参考资料中看到了两种实现方式,都做了尝试

代码1

from transitions import Machine

class Matter:
pass
model = Matter() states = ['New','Ready','Waiting','Running','Terminated'] transitions = [
{'trigger':'Admitted','source':'New','dest':'Ready'},
{'trigger':'Dispath','source':'Ready','dest':'Running'},
{'trigger':'Interrupt','source':'Running','dest':'Ready'},
{'trigger':'Exit','source':'Running','dest':'Terminated'},
{'trigger':'Input/Output or event wait','source':'Running','dest':'Waiting'},
{'trigger':'Input/Output or event completion','source':'Waiting','dest':'Ready'},
] machine = Machine(model = model, states = states, transitions = transitions, initial = 'New') print(model.state) model.Admitted() print(model.state)

代码2

from transitions import Machine
from collections import namedtuple class FsmState:
def enter(self,event,fsm):
pass def exit(self, fsm):
pass class New(FsmState):
def enter(self,event,fsm):
print('New') def exit(self,fsm):
print('Ready') class Ready(FsmState):
def enter(self,event,fsm):
print('Ready') def exit(self,event,fsm):
print('Running') class Running(FsmState):
def enter(self,event,fsm):
print('Running') def exit_1(self,fsm):
print('Ready') def exit_2(self,fsm):
print('Waiting') def exit_3(self,fsm):
print('Terminated') class Waiting(FsmState):
def enter(self,evevt,fsm):
print('Waiting') def exit(self,fsm):
print('Ready') class FsmFinalState(FsmState):
def enter(self,event,fsm):
print('Terminated') class FsmEvent:
pass class Admitted(FsmEvent):
pass class Dispatch(FsmEvent):
pass class Interrupt(FsmEvent):
pass class IO_EW(FsmEvent):
pass class IO_EC(FsmEvent):
pass class Exit(FsmEvent):
pass Transaction = namedtuple('Transaction',['prev_state','event']) class FSM:
def __init__(self,context):
self.context = context
self.state_transaction_table = []
self.global_transaction_table = []
self.current_state = None
self.working_state = FsmState def add_global_transaction(self,event,end_state):
if not issubclass(end_state,FsmFinalState):
raise FsmException('The state should be FsmFinalState')
self.global_transaction_table.append(Transaction(self.working_state,end_state)) #
def add_transaction(self,prev_state, event, next_state):
if issubclass(prev_state, FsmFinalState):
raise FsmException("It's not allowed to add transaction after Final State Node")
self.state_transaction_table.append(Transaction(prev_state, event, next_state)) def process_event(self, event):
for transaction in self.global_transaction_table:
if isinstance(event, transaction.event):
self.current_state = transaction.next_state()
self.current_state.enter(event, self)
self.clear_transaction_table()
return
for transaction in self.state_transaction_table:
if isinstance(self.current_state, transaction.prev_state) and isinstance(event, transaction.event):
self.current_state.exit(self.context)
self.current_state = transaction.next_state()
self.current_state.enter(event, self)
if isinstance(self.current_state, FsmFinalState):
self.clear_transaction_table()
return
raise FsmException("Transaction not found") def clear_transaction_table(self):
self.global_transaction_table = []
self.state_transaction_table = []
self.current_state = None def run(self):
if len(self.state_transaction_table) == 0: return
self.current_state = self.state_transaction_table[0].prev_state()
self.current_state.enter(None, self) def isRunning(self):
return self.current_state is not None def next_state(self, event):
for transaction in self.global_transaction_table:
if isinstance(event, transaction.event):
return transaction.next_state
for transaction in self.state_transaction_table:
if isinstance(self.current_state, transaction.prev_state) and isinstance(event, transaction.event):
return transaction.next_state
return None class FsmException(Exception):
def __init__(self, description):
super().__init__(description) class ZTJ(FSM):
def __init__(self):
super().__init__(None) ztj = ZTJ();
ztj.add_transaction(New, Admitted, Ready)
ztj.add_transaction(Ready, Dispatch, Running)
ztj.add_transaction(Running, Interrupt, Ready)
ztj.add_transaction(Running, IO_EW,Waiting)
ztj.add_transaction(Waiting, IO_EC, Ready)
ztj.add_transaction(Running, Exit, FsmFinalState)
ztj.run() ztj.process_event(Admitted())
ztj.process_event(Dispatch())
ztj.process_event(Interrupt())
ztj.process_event(IO_EW())
ztj.process_event(IO_EC())
ztj.process_event(Exit())

程序报错



查找资料后找到一种错误原因



但是我在定义函数时已经添加了self参数,但是程序仍然报错,不知道该怎么解决

python模拟进程状态的更多相关文章

  1. Python模拟登陆新浪微博

    上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...

  2. 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学 ...

  3. Python模拟C++输出流

    看到一Python例子,挺有意思的,用Python模拟C++的输出流OStream.单纯只是玩. 原理: 利用Python __lshift__左移内建函数<<,调用时将输出内容,如果内容 ...

  4. 【py登陆】python模拟登录

    用Python模拟登录网站 前面简单提到了 Python 模拟登录的程序,但是没写清楚,这里再补上一个带注释的 Python 模拟登录的示例程序.简单说一下流程:先用cookielib获取cookie ...

  5. 谈网页游戏外挂之用python模拟游戏(热血三国2)登陆

    看web看多了,想写写页游的外挂,其实原理是一样的,就是端口不一样协议字段你不知道,而这也提高了点技术门槛,看我们来一点一点突破这些门槛,这次我们来用python发包模拟flash的客户端登陆. 以热 ...

  6. python 模拟浏览器

    想用python模拟浏览器访问web的方法测试些东西,有哪几种方法呢? 一类:单纯的访问web,不解析其js,css等. 1. urllib2 #-*- coding:utf-8 -* import ...

  7. 【DataStructure In Python】Python模拟二叉树

    使用Python模拟二叉树的基本操作,感觉写起来很别扭.最近做编译的优化,觉得拓扑排序这种东西比较强多.近期刷ACM,发现STL不会用实在太伤了.决定花点儿时间学习一下STL.Boost其实也很强大. ...

  8. 【DataStructure In Python】Python模拟栈和队列

    用Python模拟栈和队列主要是利用List,当然也可以使用collection的deque.以下内容为栈: #! /usr/bin/env python # DataStructure Stack ...

  9. Python模拟键盘输入和鼠标操作

    Python模拟键盘输入和鼠标操作 一.Python键盘输入模拟: import win32api import win32con win32api.keybd_event(17,0,0,0)  #c ...

随机推荐

  1. windows程序设计04_显示汉字的16进制

    看下面的代码 //utf-8编码 #include<stdio.h> int main() { char a[] = "中国"; printf("%x\n&q ...

  2. css3(1)

    边框: 盒子圆角:border-radius:5px / 20%: border-radius:5px 4px 3px 2px; 左上,右上,右下,左下. 盒子阴影: box-shadow: box- ...

  3. 【Vuejs】350- 学习 Vue 源码的必要知识储备

    前言 我最近在写 Vue 进阶的内容.在这个过程中,有些人问我看 Vue 源码需要有哪些准备吗?所以也就有了这篇计划之外的文章. 当你想学习 Vue 源码的时候,需要有扎实的 JavaScript 基 ...

  4. 选择排序 C&&C++

    选择排序 选择排序即在每一步中选取最小值重新排列,从而达到排序的目的   流程: (1)先从原始数组选择一个最小数据和第一个位置交换 (2)剩下的n-1个数据选择最小的和第二个位置交换 (3)不断重复 ...

  5. Oracle常用函数(略微少了点 不过是自己稍微整理的)

    DECODE ​ DECODE(value ,if 1, then 1,if 2,then 2, ....,else) ​ 解析: ​ if 条件=1 ​ return (value 1) ​ if条 ...

  6. NLP(十八)利用ALBERT提升模型预测速度的一次尝试

    前沿   在文章NLP(十七)利用tensorflow-serving部署kashgari模型中,笔者介绍了如何利用tensorflow-serving部署来部署深度模型模型,在那篇文章中,笔者利用k ...

  7. Python核心技术与实战 笔记

    基础篇 Jupyter Notebook 优点 整合所有的资源 交互性编程体验 零成本重现结果 实践站点 Jupyter 官方 Google Research 提供的 Colab 环境 安装 运行 列 ...

  8. c++-重载运算符(+-,++,--,+=,-=,cin,cout)

    操作符重载 自定义类型需要操作符重载 运算符重载入门技术推演 友元函数和成员函数实现2元运算符重载 友元函数和成员函数实现1元运算符重载(前置++,前置--,后置++,后置--) 友元函数实现运算符重 ...

  9. Java 商户管理系统 客户管理 库存管理 销售报表 SSM项目源码

    系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM ...

  10. Linux中获取本机的最新IPv6地址_更新ddns的脚本

    Linux中获取本机的最新IPv6地址_更新ddns的脚本 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-07. 运营商提供ipv6地址. 路由器后有台linux机器,通过e ...