Это правильный способ использовать переменную между двумя потоками?

1

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

Теги:
python-3.x
multithreading
mutex

1 ответ

1
Лучший ответ

Да, вы уверены, что у вас возникнет проблема, если два процесса влияют на одну и ту же переменную одновременно.

Чтобы преодолеть это, вы должны использовать threading.Lock() (это потоковая мьютексовая система).

lock = threading.Lock()
lock.acquire()
try:
    yourVariable += 1
finally:
    lock.release()

Надеюсь, я тебе помог.

  • 0
    Спасибо за ответ, у меня есть вопрос к вам, как python знает, что yourVariable является блокировкой, а не другой переменной?
  • 0
    Когда вы вызываете lock.acquire () без аргументов, блокируйте все переменные до тех пор, пока блокировка не будет разблокирована (lock.release ()).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню