Хобрук: Ваш путь к мастерству в программировании

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

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


Ответы:


1

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

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

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

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

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

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..