文章目錄
- 前言
- 一、_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使用