文章目录
- 前言
- 一、_thread模块API
- 二、使用示例
- 创建并启动线程
- 停止线程
- _thread.exit()
- 总结
前言
K230上不支持threading,只能支持_thread,该模块实现了相应 CPython 模块的子集,CPython 是 Python 编程的参考实现 语言,也是最著名的一种。然而,它是众多 实现(包括 Jython、IronPython、PyPy 和 MicroPython)。 虽然 MicroPython 的实现与 CPython 有很大不同, 它旨在保持尽可能多的兼容性
一、_thread模块API
_thread.LockType
这是 lock 对象的类型。_thread.start_new_thread(函数, args[, kwargs])
启动新线程并返回其标识符。线程使用参数 list args(必须是 Tuples)执行函数函数。可选的 kwargs 参数指定关键字参数的字典。当函数 返回,则线程会静默退出。当函数以 unhandled 异常,则会打印堆栈跟踪,然后线程退出(但 其他线程继续运行)。_thread.interrupt_main()
在主线程中引发异常。子线程可以 使用此功能可中断主线程。_thread.exit()
引发异常。如果未捕获,这将导致 thread 以静默方式退出。_thread.allocate_lock()
返回新的 lock 对象。锁的方法如下所述。该锁是 最初解锁。_thread.get_ident()
返回当前线程的 'thread identifier'。这是一个非零 整数。它的值没有直接的意义;它旨在作为一个神奇的 cookie 来 例如,用于索引特定于线程的数据的字典。线程标识符 当一个线程退出并创建另一个线程时,可能会被回收。_thread.stack_size([大小])
返回创建新线程时使用的线程堆栈大小。可选的 size 参数指定要用于后续创建的堆栈大小 threads 的 URL 中,并且必须为 0(使用 platform 或 configured default)或正数 整数值至少为 32,768 (32 KiB)。如果未指定 size, 使用 0。如果更改线程堆栈大小是 unsupported,则引发 a。如果指定的堆栈大小为 invalid,则引发 a 且堆栈大小未修改。32 KiB 是当前支持的最小堆栈大小值,以保证足够 stack 空间。请注意,某些平台可能具有 对堆栈大小值的特定限制,例如要求 最小堆栈大小> 32 KiB 或需要按系统的倍数分配 内存页面大小 - 应参阅平台文档了解更多信息 信息(4 KiB 页很常见;使用 4096 的倍数作为堆栈大小为 在没有更具体信息的情况下建议的方法)。 可用性: Windows,具有 POSIX 线程的系统。_thread.TIMEOUT_MAX
timeout 参数允许的最大值。指定大于此值的超时将 引发 .Lock.acquire()lock.acquire(waitFlag=1,超时=-1)
如果没有任何可选参数,此方法将无条件获取锁,如果 需要等待,直到它被另一个线程释放(只有一个线程在 时间可以获得一把锁——这就是它们存在的原因)。如果存在整数 waitflag 参数,则操作取决于其 value:如果为零,则只有在可以获取锁的情况下才会获取锁 立即不等待,如果为非零,则获取锁 无条件地如上所述。如果存在浮点超时参数且为正数,则 指定返回前的最长等待时间(以秒为单位)。负 timeout 参数指定无界等待。不能指定 如果 WaitFlag 为零,则为 Timeout。返回值是是否成功获取锁,如果未成功获取。TrueFalselock.release()
释放锁。该锁必须是较早获得的,但不是 必须通过同一条线索。lock.locked()
返回锁的状态:如果它已被某个线程获取,如果没有。TrueFalse
二、使用示例
创建并启动线程
创建2个线程,分别进行打印
import _thread
import timedef task_1():while True:print("task 1")time.sleep(1)def task_2():while True:print("task 2")time.sleep(1)#创建闪灯task和串口task
_thread.start_new_thread(task_1, ())
_thread.start_new_thread(task_2, ())while True:time.sleep(0.01) #防止CPU满跑
停止线程
在python的介绍中,_thread并没有制定摧毁某个task的接口,只有在task调用的函数退出运行,也就是要退出task中的while,所以,我们可以使用一个flag,来决定while是否可以运行。
import _thread
import timetask_run_flag = Truedef task_1():global task_run_flagwhile task_run_flag:print("task 1")time.sleep(1)def task_2():global task_run_flagcount=0while True:count=count+1print("task 2")if count >10:task_run_flag=Falsetime.sleep(1)#创建闪灯task和串口task
_thread.start_new_thread(task_1, ())
_thread.start_new_thread(task_2, ())while True:time.sleep(0.01) #防止CPU满跑
_thread.exit()
调用_thread.exit()后,线程退出
import _thread
import timetask_run_flag = Truedef task_1():global task_run_flagwhile task_run_flag:print("task 1")time.sleep(1)def task_2():global task_run_flagcount=0while True:count=count+1print("task 2")if count >10:task_run_flag=False_thread.exit()time.sleep(1)#创建闪灯task和串口task
_thread.start_new_thread(task_1, ())
_thread.start_new_thread(task_2, ())while True:time.sleep(0.01) #防止CPU满跑
总结
本章节介绍了K230多线程的示例,大家可以根据项目实际需要参考API使用