前一阶段看到有网友希望在microPython上运行多线程。我觉得这个有些困难。首先,CPython就没有解决GIL的问题。所以多线程就是一个梦。Java是可以的。但是任务调度的确是一个需求。
从Python2.7开始,标准库里就有sched。但是micropython没有实现。不过micropython的作者推荐了一个简单的调度器类实现。
- #A demo scheduler.py
- import pyb
- class Scheduler:
- def __init__(self):
- self.events = []
- def schedule(self, delay, function):
- if delay <= 0:
- function()
- else:
- self.events.append([delay, function])
- self.events.sort(key=lambda event:event[0])
- def run(self):
- while len(self.events) > 0:
- delay, function = self.events.pop(0)
- for event in self. events:
- event[0] -= delay
- pyb.delay(delay)
- function()
-
- class LED:
- def __init__(self, led_id, time_on, time_off):
- self.led_id = led_id
- self.time_on = time_on
- self.time_off = time_off
- self.on()
-
- def on(self):
- pyb.LED(self.led_id, True)
- sched.schedule(self.time_on, self.off)
-
- def off(self):
- pyb.LED(self.led_id, False)
- sched.schedule(self.time_off, self.on)
-
- sched = Scheduler()
- LED(1, 1000, 2000)
- LED(2, 3000, 1000)
- sched.run()
复制代码但是作者提供的代码有语法错误。(提供大家纠错)我将代码稍微改成另外的形式。
- #A demo scheduler.py
- import pyb
- class Scheduler:
- def __init__(self):
- self.events = []
- def schedule(self, delay, function):
- if delay <= 0:
- function()
- else:
- self.events.append([delay, function])
- self.events.sort(key=lambda event:event[0])
- def run(self):
- while len(self.events) > 0:
- delay, function = self.events.pop(0)
- for event in self. events:
- event[0] -= delay
- pyb.delay(delay)
- function()
- def job1():
- pyb.LED(1).toggle()
- sched.schedule(1000,job2)
-
- def job2():
- pyb.LED(2).toggle()
- sched.schedule(2000,job1)
-
- sched = Scheduler()
- job1()
- job2()
- sched.run()
复制代码
但是Scheduler类中,时间调度采用pyb.delay()来使用,是阻塞型的调度器。不能够让人满意。不过,暂时可以提供给大家使用吧。