uPyCraft-micropython教程之线程与锁

2017-07-221.7万
AI 快速预览详细 收起
本教程介绍了如何在FireBeetle-ESP32主板上使用micropython实现线程与锁的功能。通过创建3个线程(A、B、C)和一把锁,演示了多线程同步的实现方法。A线程睡眠2秒,B线程睡眠1秒,C线程无限制执行。B线程醒来后持有所并睡眠5秒,A线程尝试获取锁失败被阻塞,直到B线程释放锁后A线程才得到执行。通过这种方式,确保程序按预期顺序运行。
在pyboard和esp32上,都支持线程与锁。我们做一个小实验,演示一下这个功能
在这个实验中我们创建3个线程和一把锁lock,创建顺序为A,B,C。让A,B去争抢这把锁。

实验准备
  硬件
    1. FireBeetle-ESP32主板
  软件
    1. uPyCraft-0.22
    2. 测试用代码thread.py

预期结果
1. A睡眠 2秒
2. B睡眠 1秒
3. C没有任何限制,最先被执行
4. B醒来,持有所,然乎睡眠5秒
5. A醒来,去获取锁失败,被阻塞,直到B释放这把所
6. B睡眠5秒完成,释放锁
7. A得到执行

本次实验代码如下:
[mw_shl_code=python,true]import _thread
import time

lock=_thread.allocate_lock()

def funcA(sec):
  time.sleep(sec)

  with lock:
    print('Running thread A')
  _thread.exit()


def funcB(sec):
  time.sleep(sec)
  with lock:
    print('Running thread B')
    print('Thread B sleep 5 seconds')
    time.sleep(5)
    print('thread B weakup')
  _thread.exit()

def funcC():
  print('Running thread C')
  _thread.exit()

_thread.start_new_thread(funcA, (2,))
_thread.start_new_thread(funcB, (1,))
_thread.start_new_thread(funcC, ())

while True:
  pass
[/mw_shl_code]
将代码烧录并运行,执行结果见下图,与预期结果一致

uPyCraft-micropython教程之线程与锁图1




创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
xizonghu
xizonghu
提示
ImportError: no module named '_thread'
秦皇岛岛主
秦皇岛岛主
作者
回复xizonghu
pyboard和esp32,只有这两个可以用线程
xizonghu
xizonghu
原来esp8266不能用啊
- 没有更多了 -