使用Asyncio的Coroutine来实现一个有限状态机

如图:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import asyncio
import datetime
import time
from random import randint

@asyncio.coroutine
def StartState():
    print("Start State called \n")
    input_value = randint(0, 1)
    time.sleep(1)
    if (input_value == 0):
        result = yield from State2(input_value)
    else:
        result = yield from State1(input_value)
    print("Resume of the Transition: \nStart State calling " \
          + result)

@asyncio.coroutine
def State1(transition_value):
    outputValue = str(("State 1 with transition value = %s \n" \
                       %(transition_value)))
    input_value = randint(0, 1)
    time.sleep(1)
    print("...Evaluating....")
    if (input_value == 0):
        result = yield from State3(input_value)
    else:
        result = yield from State2(input_value)

    result = "State 1 calling " + result
    return (outputValue + str(result))

@asyncio.coroutine
def State2(transition_value):
    outputValue = str(("State 2 with transition value = %s \n" \
                       %(transition_value)))
    input_value = randint(0, 1)
    time.sleep(1)
    print("...Evaluating....")
    if (input_value == 0):
        result = yield from State1(input_value)
    else:
        result = yield from State3(input_value)

    result = "State 2 calling " + result
    return (outputValue + str(result))

@asyncio.coroutine
def State3(transition_value):
    outputValue = str(("State 3 with transition value = %s \n" \
                       %(transition_value)))
    input_value = randint(0, 1)
    time.sleep(1)
    print("...Evaluating....")
    if (input_value == 0):
        result = yield from State1(input_value)
    else:
        result = yield from EndState(input_value)

    result = "State 2 calling " + result
    return (outputValue + str(result))

@asyncio.coroutine
def EndState(transition_value):
    outputValue = str(("End State with transition value = %s \n" \
                       %(transition_value)))
    print("...Stop Computation...")
    return (outputValue)

if __name__ == "__main__":
    print("Finite State Machine simulation With Asyncio Coroutine")
    loop = asyncio.get_event_loop()
    loop.run_until_complete(StartState())

时间: 2024-12-21 19:08:56

使用Asyncio的Coroutine来实现一个有限状态机的相关文章

一个使用 asyncio 协程的网络爬虫(二)

协程 还记得我们对你许下的承诺么?我们可以写出这样的异步代码,它既有回调方式的高效,也有多线程代码的简洁.这个结合是同过一种称为协程coroutine的模式来实现的.使用 Python3.4 标准库 asyncio 和一个叫"aiohttp"的包,在协程中获取一个网页是非常直接的( @asyncio.coroutine 修饰符并非魔法.事实上,如果它修饰的是一个生成器函数,并且没有设置 PYTHONASYNCIODEBUG 环境变量的话,这个修饰符基本上没啥用.它只是为了框架的其它部分

一个使用 asyncio 协程的网络爬虫(三)

使用协程 我们将从描述爬虫如何工作开始.现在是时候用 asynio 去实现它了. 我们的爬虫从获取第一个网页开始,解析出链接并把它们加到队列中.此后它开始傲游整个网站,并发地获取网页.但是由于客户端和服务端的负载限制,我们希望有一个最大数目的运行的 worker,不能再多.任何时候一个 worker 完成一个网页的获取,它应该立即从队列中取出下一个链接.我们会遇到没有那么多事干的时候,所以一些 worker 必须能够暂停.一旦又有 worker 获取一个有很多链接的网页,队列会突增,暂停的 wo

python中asyncio用法详解

二月中旬以来一直在看 Python 协程方面的东东(或者说是使用 aiohttp 这个异步库写个爬虫).上周末,终于写出了一个差强人意的版本.就在这里写一写自己的心得. async / await 这在 Python 的协程中无足轻重.而我在二月份写的几篇博文却是专为这做的前序.一个月前我还对他们一窍不通,很不理解协程,通过这一个月的学习,我豁然开朗,大致了解了协程的前世今生. async 与 await , 这是在 Python3.5 中引入的新语法,用于增强 Python 协程方面的支持.但

JavaScript与有限状态机学习

有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物. 简单说,它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. * 某种条件下,会从一种状态转变(transition)到另一种状态. 它对JavaScript的意义在于,很多对象可以写成有限状态机. 举例来说,网页上有一个菜单元素.鼠标悬停的时候,菜单显示:鼠标移开的时候,菜单隐藏.如果使用有限状态机描述,就是这个菜单只有两种状态(显示和隐藏),鼠标会引发状

python coroutine的学习跟总结[转]

简介     因为最近一段时间需要研究一些openstack相关的东西,在阅读一些相关代码的时候碰到很多python特定的一些特性,比如generator, coroutine以及一些相关的类库,比如eventlet, greenlet.在openstack里引用的第三方类库非常多,这些特性和类库看起来还比较复杂.如果需要对openstack里面某些特性的实现非常熟悉的话,就需要对这些牵涉到的基础的东西有个很好的了解.这里就针对coroutine的特性和它的使用做一个总结.   coroutin

前端开发中使用”有限状态机“解决复杂的交互问题

前端开发是有逻辑的,这点毋庸置疑.程序员的思维逻辑赋予了代码各种能力,但是前端开发中经常面对的是用户的操作.在一个比较复杂的页面中(貌似现在也很少有简单页面了),用户的操作是不可预见的,假如有很多按钮,每个按钮都会做一件自己独一无二的事,如果上帝保佑所有的这些操作,这些事件都彼此没有限制,而且结果互不影响,那没有问题.但在开发中好像没有这种好运气,所以经常需要协调和平衡这些函数之间的执行. 如果你使用的是纯JS或者单独仅有jQuery的情况下,遇到这种让人焦头烂额的情形会尤为明显,前端MVC一定

javascript与有限状态机详解_基础知识

简单说,它有三个特征: 复制代码 代码如下: * 状态总数(state)是有限的.* 任一时刻,只处在一种状态之中.* 某种条件下,会从一种状态转变(transition)到另一种状态. 它对JavaScript的意义在于,很多对象可以写成有限状态机. 举例来说,网页上有一个菜单元素.鼠标悬停的时候,菜单显示:鼠标移开的时候,菜单隐藏.如果使用有限状态机描述,就是这个菜单只有两种状态(显示和隐藏),鼠标会引发状态转变. 代码可以写成下面这样: 复制代码 代码如下: var menu = { //

《游戏编程模式》一7.2 救星:有限状态机

7.2 救星:有限状态机 为了消除你心中的疑惑,你可以准备一张纸和一支笔,让我们一起来画一张流程图.对于女主角能够进行的动作画一个"矩形":站立.跳跃.躲避和俯冲.当你可以按下一个键让主角从一个状态切换到另一个状态的时候,我们画一个箭头,让它从一个矩形指向另一个矩形.同时在箭头上面添加文本,表示我们按下的按钮. 恭喜,你刚刚已经成功创建了一个有限状态机.有限状态机借鉴了计算机科学里的自动机理论(automata theory)中的一种数据结构(图灵机)思想.有限状态机(FSMs)可以看

Lua协同程序函数coroutine使用实例_Lua

协程是协同程序的简称,顾名思义,就是协同工作的程序.协程拥有自己独立的桟.局部变量和PC计数器,同时又与其他协同程序共享全局变量和其他大部分东西: 协程与线程的主要区别在于,一个多线程程序可以同时运行几个线程(并发执行.抢占),而协同程序却需要彼此协作地运行,即一个多协程程序在任意时刻只能运行一个协程,并且正在执行的协程只会在其显式地要求挂起(suspend)时,它的执行才会暂停(无抢占.无并发).  Lua中所有与协程相关的函数都在coroutine(一个table)中: 函数create用于