这是在 2 个线程之间使用变量的正确方法吗?
Is this the correct way to use variable between 2 Threads?
我有一个从串行端口读取数据的脚本,所以我有一个无限循环,它总是将我的数据填充到全局变量,而且我还安排了一个函数,每隔 X 秒 运行 到 post在数据库中,这个函数也使用相同的全局变量。
这是我创建的一个小示例,向您展示我的情况:
import serial
import schedule
import threading
shared_var = []
def save_to_db():
print(threading.current_thread())
global shared_var
for l in shared_var:
print(l)
shared_var.clear()
def run_threaded(job_func):
job_thread = threading.Thread(target=job_func)
job_thread.start()
ser = serial.Serial() # initialize the serial
ser.baudrate = 115200 # set the baud rate : default 115200
ser.port = "/dev/ttyUSB0" # set the port to use
ser.timeout = 30
ser.write_timeout = None
if not ser.is_open:
ser.open() # Open port
ser.write(b'scan=01\r\n') # Stop scan if already started
schedule.every(5).seconds.do(run_threaded, save_to_db)
while 1:
schedule.run_pending()
line = ser.readline()
shared_var.append(line)
print(threading.current_thread())
这段代码会导致问题吗?更具体地说,如果 MainThread(从 Serail 端口读取并写入 shared_var
的线程)写入 2 个线程之间的共享变量,同时另一个线程从变量读取,将会发生什么,这将导致问题,因为 2 个线程将同时访问同一个全局变量?如果是的话,我应该为此使用互斥机制吗?
是的,如果 2 个进程同时影响同一个变量,您肯定会遇到问题。
要克服这个问题,您必须使用 threading.Lock()(这是 Threading 的互斥系统)。
lock = threading.Lock()
lock.acquire()
try:
yourVariable += 1
finally:
lock.release()
希望对你有所帮助。
我有一个从串行端口读取数据的脚本,所以我有一个无限循环,它总是将我的数据填充到全局变量,而且我还安排了一个函数,每隔 X 秒 运行 到 post在数据库中,这个函数也使用相同的全局变量。
这是我创建的一个小示例,向您展示我的情况:
import serial
import schedule
import threading
shared_var = []
def save_to_db():
print(threading.current_thread())
global shared_var
for l in shared_var:
print(l)
shared_var.clear()
def run_threaded(job_func):
job_thread = threading.Thread(target=job_func)
job_thread.start()
ser = serial.Serial() # initialize the serial
ser.baudrate = 115200 # set the baud rate : default 115200
ser.port = "/dev/ttyUSB0" # set the port to use
ser.timeout = 30
ser.write_timeout = None
if not ser.is_open:
ser.open() # Open port
ser.write(b'scan=01\r\n') # Stop scan if already started
schedule.every(5).seconds.do(run_threaded, save_to_db)
while 1:
schedule.run_pending()
line = ser.readline()
shared_var.append(line)
print(threading.current_thread())
这段代码会导致问题吗?更具体地说,如果 MainThread(从 Serail 端口读取并写入 shared_var
的线程)写入 2 个线程之间的共享变量,同时另一个线程从变量读取,将会发生什么,这将导致问题,因为 2 个线程将同时访问同一个全局变量?如果是的话,我应该为此使用互斥机制吗?
是的,如果 2 个进程同时影响同一个变量,您肯定会遇到问题。
要克服这个问题,您必须使用 threading.Lock()(这是 Threading 的互斥系统)。
lock = threading.Lock()
lock.acquire()
try:
yourVariable += 1
finally:
lock.release()
希望对你有所帮助。