Как я должен обрабатывать блокировку получения и освобождения с потоками с разными намерениями - PullRequest
0 голосов
/ 25 апреля 2019

Я работаю с модемом, и мне нужно проверить сигнал, доступный постоянно, чтобы он работал правильно.

У меня есть код, работающий без потоков, но он не работает с этапом постоянной проверки сигнала.

Я сейчас тестирую потоки, но у меня проблемы с операцией release ().

Мой код:

lock = threading.Lock()

def checking_signal():

    while True:

        with lock:

            print('Lock Acquired')
            x = ser.readline()
            y = x.rstrip()
            z = y.decode('utf-8')
            print(z)
            ser.write(str.encode('AT+CSQ\r'))
            time.sleep(5)
            if (z.startswith("+CSQ")):
                a = int(z[5])
                if a >= 3:
                    print('Qualidade do sinal', z[5], 'é suficiente')
                    Signal = True
                    #read_mt_message()
                    lock.release()
                    time.sleep(6)
                else:
                    print('Buscando Sinal...')
                    lock.release()
                    time.sleep(0.5)



t = threading.Thread(target = checking_signal)
t.start()

Работает, проверяя сигнал 2 раза, затем возвращает ошибку:

Exception in thread Thread-5:
Traceback (most recent call last):
  File "/home/anaconda3/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/home/anaconda3/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "<ipython-input-2-03211eb25532>", line 44, in checking_signal
    time.sleep(0.5)
RuntimeError: release unlocked lock

Я пробовал несколько разных подходов, но результат не меняется. Моя главная цель - чтобы один поток проверял сигнал, а другой начал работать, только если сигнала достаточно.

Спасибо за ваше время!

...