uRouter – 新生代mpy web框架

大家好!之前我给 micropython 开发过一个名为 micro-route 的web框架,在使用的过程中发现这个框架在设计上有很多的缺陷,而且是经过一个星期的时间赶工出来的,代码质量不太行,运行效率也很差。所以,这次我根据单片机的特性重新设计了一款新的web框架—— micropython-uouter

Li-Lian1069/micropython-urouter: A lightweight HTTP request routing processing support library based on micropython. The previous name was micro-route (github.com)

简单说下这个和之前那个 micro-route 以及一些其他主流 mpy-web 框架的区别。

首先,这个用了框架一种新的设计理念,采用 select 的方式查询请求,可以不用一直在后台loop,把计算时间让给单片机上的其他程序使用,而且可以在你需要处理请求的时候再处理请求。

比如说,现在我需要执行一个精度要求比较高的io采集任务,这个时候我不希望有新的web请求来打扰我的采集过程,在以往的micro-route框架中,web响应将会是实时的而且被分配到最高优先级,这也就意味着:当一个浏览器请求来临时,必须处理完这个 web 请求才会切换到之前的工作中。

这就很蛋疼,采集IO数据无非也就需要一秒钟之内的时间,但是web请求晚一两秒再响应完全没有任何问题,如果我先响应了这个web请求,那么我的这个io请求就采集不到了。如果说,因为采集到错误的io数据,照成系列事故,就太翻车了。

所以,这个框架提供了一个新的思路:按需查寻,当浏览器请求发送之后,我不会立马去响应这个请求,而是挂着它,当单片机有空闲的时间时,可以查寻一下是否有新进的web请求,如果有,会返回一个队列,这个队列支持价值排序,也就是最有价值的响应会被排到最前面。然后由单片机决定要执行多少任务。保证最有价值的任务会最先被执行。

这种新的处理方式,跟我们以往在PC习以为常的处理方式不太相同,在PC上可以使用多个进程多个线程,所以随便你怎么loop都无所谓,但是如果你在单片机上loop了(例如microSrv),你后面的代码就没戏了。因为单片机是单进程甚至是单线程的,不能使用loop的方式。如果采用多线程,那更是操蛋,对于单片机这种孱弱的性能,使用多线程会影响单片机的即时性甚至失去即时性,而且单片机的空间就可怜的这么点,还要给你做多线程之前的 context 切换,为了处理个web请求弄个多线程真的是得不偿失,处理过程可能只需要200ms,但是上下文切换需要100ms。所以个人认为:类似于 microSrv 的这种web处理逻辑在单片机上是完全错误的!

所以,总结下,我这个框架最大的特点就是:

  1. 有效保留单片机的及时性特征,调度更灵活,对主要业务的影响最小化。
  2. 摒弃多线程和loop思路,适应单片机生产环境。达到更少的内存占用和处理时间需要
  3. 支持价值优先策略,有效保障关键业务被处理。

当然,这个框架还有更多特别的特性,大家可以慢慢去探索。

这里贴一下我的官方文档:

主页 – micropython-uRouter Document (m-jay.cn)

GitHub地址:

Li-Lian1069/micropython-urouter: A lightweight HTTP request routing processing support library based on micropython. The previous name was micro-route (github.com)

文档内有例子和详细的讲解,大家可以按照指引入门蛤~

6 评论

  1. class uRouter():
    # ========vars==========
    _sock: socket.socket
    _stop: bool
    _poll: Poll

    router.py:35:10: invalid syntax
    _sock: socket.socket
    ^

  2. from urouter import uRouter
    app = uRouter()

    @app.route(“/”)
    def index():
    return “Hello World!”

    app.serve_forever()

    >>> %Run -c $EDITOR_CONTENT
    Traceback (most recent call last):
    File “”, line 3, in
    ImportError: no module named ‘urouter’
    >>> %Run -c $EDITOR_CONTENT
    Traceback (most recent call last):
    File “”, line 3, in
    File “router.py”, line 15, in
    ImportError: can’t perform relative import
    >>> %Run -c $EDITOR_CONTENT
    Traceback (most recent call last):
    File “”, line 3, in
    File “router.py”, line 15, in
    ImportError: can’t perform relative import

留下评论