6387|2

111

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【upython】实现协程,Thread之外的选择 [复制链接]

 
最近,micropython V1.8.2实现了Thread,这迎合了大多数应用开发者的需求。其实其他嵌入式如PyMite,Zerynth在很早实现了Thread类。但是,CPython因为GIL的原因,没有严格意义的多线程。而CPython的进程和线程都是基于操作系统构建的,所以一开始micropython没有实现Thread类。也可以理解。

但是micropython实现了yield,生成器,其特点是支持闭包,保持局部变量。所以可以尝试一下协程(co-routine)的写法。以生产P、消费C两个co-routine为例。每执行到yield语句,代表当前routine交出控制权,由另一routine执行。另一routine执行后,当前routine取回控制权,并恢复现场原有的局部变量,继续执行。循环往复。由于是routine自行约定交出条件,属于协作式多任务。被称之为协程。



  1.    import urandom

  2.    def genData():
  3.        data = [i for i in range(4)]
  4.        for i in range(4):
  5.            data[i] = urandom.randint(1,100)      
  6.        return data

  7.    def consume():
  8.        moving_sum = 0
  9.        data_seen = 0
  10.        while True:
  11.            print("wait for to consume")
  12.            data = yield # handover to producer routine
  13.            data_seen += len(data)
  14.            moving_sum += sum(data)
  15.            print('Consumed, average %f'%(moving_sum/data_seen))

  16.    def produce(consumer):
  17.        while True:
  18.            data = genData()
  19.            print('Produced %s'%repr(data))
  20.            consumer.send(data)
  21.            yield # handover to consumer routine

  22.    consumer = consume()
  23.    consumer.send(None)
  24.    producer = produce(consumer)

  25.    for i in range(10):
  26.        print ('Producing...')
  27.        next(producer)
复制代码


代码来自网络,在micropython和桌面CPython上均作了测试,两者表现一样棒!【注】micropython通过urandom支持随机数。

协程对于嵌入式C语言开发者比较新,但是C#/Java都支持yield关键字。返回在硬件上是退栈。yield不同于返回。如果硬要在C语言中实现协程,比较麻烦,需要在汇编或者使用“古怪”的C语言语法,不利于维护。有个替代品,mbed OS中有Thread.sleep()。它的sleep()不是local loop。而是将控制权交回RTOS调度器。

看完这篇,希望网友不仅可以利用micropython的新的Thread,还可以利用Python语言本身特性实现多任务。不要像C语言中那样大量使用delay(),sleep()函数。我自己的原则是,如果延时在10ms左右,还可以忍受堵塞其他任务。如果延时超过100ms,使用协程比较合适。

同样道理,利用RTOS开发C语言程序是时候了。标准C语言开发嵌入式裸机:mainloop + timer + callback + ISR,可以构建完整程序,但是delay和sleep目前暂时需要借用RTOS调度器。或许那位网友可以将某些RTOS这部分调度算法单独规划独立成为一个yield宏。

最新回复

感觉有点象非占先式的RTOS。Thread在unix版的micropytthon上可以了,但是ESP8266、PYB等上面还不能用吧。  详情 回复 发表于 2016-7-20 09:08
点赞 关注
 
 

回复
举报

1059

帖子

1

TA的资源

版主

沙发
 
很好,准备试试
 
 
 

回复

1万

帖子

24

TA的资源

版主

板凳
 
感觉有点象非占先式的RTOS。Thread在unix版的micropytthon上可以了,但是ESP8266、PYB等上面还不能用吧。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表