У меня есть скрипт, который читает данные из последовательного порта, поэтому у меня есть бесконечный цикл, который всегда заполняет мои данные в глобальную переменную, а также я планирую функцию, которая запускается каждые X секунд, для публикации в базе данных, и эта функция также используйте ту же глобальную переменную.
Вот небольшой пример, который я создаю, чтобы показать вам мою ситуацию:
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 Port и записывает в shared_var
), записывает в общую переменную между двумя потоками, и в тот же момент другой поток читает из переменной, это вызовет проблема, потому что 2 потока будут обращаться к одной и той же глобальной переменной в одно и то же время? и если да, это проблема, я должен использовать мьютекс механизм для этого?