移远QuecPython(基于EC600s)开发物联网应用(六) 多线程, 输入输出流, 文件操作, 内存碎片回收

一. _thread - 多线程

_thread 模块提供创建新线程的方法,并提供互斥锁, 线程最多16个

import _thread
方法 描述
_thread.get_ident() 获取当前线程号
_thread.get_heap_size() 获取系统剩余内存大小
_thread.stack_size(size) 设置创建新线程使用的栈大小(以字节为单位),默认为8k。
_thread.start_new_thread(function, args) 创建一个新线程,接收执行函数和被执行函数参数,注意:传参要传元组, 当 function 函数无参时传入空的元组。
_thread.allocate_lock() 创建一个互斥锁对象。
lock.acquire() 获取锁,成功返回True,否则返回False。
lock.release() 释放锁
lock.locked() 返回锁的状态,True表示被某个线程获取,False则表示没有.

1. 举例一: 简单的多线程并行

import _thread
import utime

counter = 0

def led_func():
  while True:
    print("这是一个LED闪灯程序, 我在每2秒疯狂闪灯!进程号",_thread.get_ident())
    utime.sleep(2)

def add1_persecond():
  while True:
    global counter
    counter += 1
    print("计数加一:",counter,",进程号:",_thread.get_ident())
    utime.sleep(1)
  

if __name__ == "__main__":
  _thread.start_new_thread(led_func,())
  _thread.start_new_thread(add1_persecond,())

2. 带参数的进程创建

带参数创建进程要注意: 参数必须传元组, 所以如果你只有一个参数a, 也应该包裹在元组中 (a,), 如果不需要参数则传递空元组()

import _thread
import utime

counter = 100

def add_thread(step):
  while True:
    global counter
    counter += step
    print("计数:",counter,",进程号:",_thread.get_ident())
    utime.sleep(1)
    
if __name__ == "__main__":
  _thread.start_new_thread(add_thread,(3,))

3. 举例三: 互斥锁

add10_persecond的for循环操作counter时, 避免minus5_persecond的for循环操作它, 所以加个互斥锁, 每个进程, 拿到这个锁才能操作公共变量counter

import _thread
import utime

lock = _thread.allocate_lock() #创建一个互斥锁

counter = 0

def led_func():
  while True:
    print("这是一个LED闪灯程序, 我在每2秒疯狂闪灯!进程号",_thread.get_ident())
    utime.sleep(2)

def add10_persecond():
  while True:
    lock.acquire()
    global counter
    for i in range(10):
      counter += 1
      print("计数加一:",counter,",进程号:",_thread.get_ident())
    lock.release()
    utime.sleep(1)
    
def minus5_persecond():
    while True:
      lock.acquire()  
      global counter
      for i in range(5):
        counter -= 1
        print("计数减一:",counter,",进程号:",_thread.get_ident())
      lock.release()
      utime.sleep(5)
      

if __name__ == "__main__":
  _thread.start_new_thread(led_func,())
  _thread.start_new_thread(add10_persecond,())
  _thread.start_new_thread(minus5_persecond,())

4. 线程退出

暂时没有提供类似于 join 函数之类的操作, 前期可以使用一个全局的标志位来标志线程的退出。
说白了就是: 如果线程中有while, 需要打破while循环,用以达到退出效果

import _thread
import utime

counter = 0

def led_func():
  global counter
  while counter<20:
    print("这是一个LED闪灯程序, 我在每2秒疯狂闪灯!进程号",_thread.get_ident())
    utime.sleep(2)

def add1_persecond():
  while True:
    global counter
    counter += 1
    print("计数加一:",counter,",进程号:",_thread.get_ident())
    utime.sleep(1)

if __name__ == "__main__":
  _thread.start_new_thread(led_func,())
  _thread.start_new_thread(add1_persecond,())

二. uio - 输入输出流

uio 模块包含其他类型的stream(类文件)对象和辅助函数。

import uio

1. 打开文件

fd = uio.open(name, mode=’r’, **kwarg)

参数:

  • name :文件名
  • mode :打开模式 r : 只读模式打开文件, w 写入模式打开文件,每次写入会覆盖上次写入数据,a 只写追加模式打开文件,可连续写入文件数据而不是覆盖数据
  • **kwarg:可变长参数列表

2. 关闭打开的文件

fd.close()

我们得到的文档流该怎么操作呢?? 详见: 第三节 : 文件和操作系统

三. 文件操作

1. read() 读文件对象

import uio
file = uio.open("/usr/test.txt",'r')
txt = file.read()
print(txt)

2. write() 写文件对象

写文件对象, 有 w 和 a 两种模式, 返回写入的字节数

import uio
file = uio.open("/usr/test.txt",'a')
file.write("好诗,好诗呀!")
print(txt)

四. gc - 内存碎片回收

gc 模块实现内存垃圾回收机制,该模块实现了CPython模块相应模块的子集。

import gc
方法 描述
gc.enable() 启用自动回收内存碎片机制
gc.disable() 禁用自动回收机制
gc.collect() 回收内存碎片
gc.mem_alloc() 返回分配的堆RAM的字节数。此功能是MicroPython扩展
gc.mem_free() 返回可用堆RAM的字节数,如果此数量未知,则返回-1。此功能是MicroPython扩展
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容