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

简单说下这个和之前那个 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处理逻辑在单片机上是完全错误的!
所以,总结下,我这个框架最大的特点就是:
- 有效保留单片机的及时性特征,调度更灵活,对主要业务的影响最小化。
- 摒弃多线程和loop思路,适应单片机生产环境。达到更少的内存占用和处理时间需要
- 支持价值优先策略,有效保障关键业务被处理。
当然,这个框架还有更多特别的特性,大家可以慢慢去探索。
这里贴一下我的官方文档:
主页 – micropython-uRouter Document (m-jay.cn)
GitHub地址:
文档内有例子和详细的讲解,大家可以按照指引入门蛤~
class uRouter():
# ========vars==========
_sock: socket.socket
_stop: bool
_poll: Poll
router.py:35:10: invalid syntax
_sock: socket.socket
^
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
Traceback (most recent call last):
File “”, line 3, in
ImportError: no module named ‘urouter.uRouter’
upip 找不到资源
[…] 去我的博客查看完整内容 […]
[…] uRouter – 新生代mpy web框架 […]