想象一下,我們有一個執行緒通過 USB 串行埠每秒讀取溫度傳感器 10 次。
而且,當用戶按下按鈕時,我們也可以通過 USB 串行更改傳感器模式。
問題:change_sensor_mode()串行寫入操作可能發生在輪詢執行緒“write/read_until”串行操作的中間,這會導致串行資料損壞。
如何用 Python 處理這個一般的多執行緒問題serial?
例子:
import threading, serial, time
serial_port = serial.Serial(port="COM2", timeout=1.0)
def poll_temperature():
while True:
serial_port.write(b"GETTEMP\r\n")
recv = serial_port.read_until(b"END")
print(recv)
time.sleep(0.2)
def change_sensor_mode():
serial_port.write(b"CHANGEMODE2\r\n")
t1 = threading.Thread(target=poll_temperature)
t1.start()
time.sleep(4.12342) # simulate waiting for user input
change_sensor_mode()
我正在考慮在串行操作中添加手動lock = True/lock = False之前/之后poll_temperature,然后主執行緒應該等待:
global lock
def change_sensor_mode():
elapsed = 0
t0 = time.time()
while lock and elapsed < 1.0:
time.sleep(0.010)
elapsed = 0.010
serial_port.write(b"CHANGEMODE2\r\n")
但肯定有更標準的方法來實作這一點。如何處理多個執行緒寫入serial?
uj5u.com熱心網友回復:
您應該使用由任何想要寫入此串行埠的執行緒共享的threading.Lock 。
import threading
write_lock = threading.Lock() # all writers have to lock this
read_lock = threading.Lock() # all readers have to lock this
def poll_temperature():
while True:
with write_lock:
serial_port.write(b"GETTEMP\r\n")
with read_lock:
recv = serial_port.read_until(b"END")
print(recv)
time.sleep(0.2)
def change_sensor_mode():
with write_lock:
serial_port.write(b"CHANGEMODE2\r\n")
這樣做的方式是,沒有兩個執行緒可以同時執行由同一個鎖保護的任何代碼,所以如果一個執行緒嘗試執行第二個函式,而另一個執行緒正在執行第一個函式中的寫入,那么第二個執行緒必須等到第一個執行緒釋放鎖。
在背景關系管理器中使用它意味著如果其中一個執行緒在該塊內失敗,那么鎖會自動釋放,從而避免死鎖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/520364.html
