Python Telnetlib Multithreading: потребительский поток не изменяет очередь - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь получить входную строку, которая записывается устройством на порт IP-адреса, изменить его, а затем записать на устройство через другой порт с тем же IP-адресом.То, как я пытаюсь это сделать (чтобы ускорить время обработки и лучше понять концепции параллельной обработки), я пытаюсь использовать модуль threading Python, а для получения и вывода строк я использую Python.telnetlib модуль.

Я проектировал это вокруг модели производитель / потребитель.Это работает так, что один поток (производитель) прослушивает один порт, чтобы получить входную строку от моего устройства, и после получения помещает ее в очередь.Поток потребителя предназначен для проверки, не является ли очередь пустой.Если это не так, он помещает первый элемент в очередь, изменяет строку и затем записывает ее на другое устройство, прослушивающее тот же IP-адрес, но на другом сервере.

Ниже приведен мой код:

import threading, telnetlib, time
try:
    import Queue
except:
    import queue as Queue

q = Queue.Queue(16) #Oddly enough, defining the queue inside of the "main" function would not allow the other functions to see/access the queue, so I've resorted to defining it outside of the main function.

class Listener:
    def __init__(self):
        time.sleep(1) 
    def run(self):
        ltn = telnetlib.Telnet("localhost", "xxx0")
        global q
        while(True):
            curr_string = ltn.read_until(b'\n')
            curr_string.decode('utf-8')
            try:
                q.put(curr_string)
                print("Listener put {0} in Queue".format(curr_string))
                print("Queue: {0}".format(q))
                pass
            except:
                print("Listener: Something went wrong...")
                pass
            time.sleep(.5)
class Speaker:
    def __init__(self):
        time.sleep(1)
    def run(self):
        stn = telnetlib.Telnet("localhost", "xxx1")
        global q
        while(True):
            if not q.empty():
                curr_string = q.get()
                new_string = fixString(curr_string)
                try:
                    stn.write(new_string.encode('ascii') + b'\n')
                    print("Speaker writing {0} to stn".format(new_string))
                except:
                    print("Speaker: Something went wrong...")
                    pass
            time.sleep(0.5)

def fixString(local_string):
    #Modifications to the string
    return local_string

def main():
    q = Queue.Queue(16)
    l = Listener()
    s = Speaker()
    lt = threading.Thread(target=l.run, args=())
    lt.daemon = True
    st = threading.Thread(target=s.run, args=())
    st.daemon = True
    lt.start()
    st.start()
    try:
        while True:
            time.sleep(0.1)
    except KeyboardInterrupt:
        print("KeyboardInterrupt detected. Closing threads and ending program.")

if __name__ == '__main__':
    main()

То, что я ожидал, должно было получить сообщение «слушатель помещает (строку) в очередь», за которой следует «Запись динамика (new_string) в stn».

Всякий раз Listener обнаружил ввод, он будет отображать соответствующее сообщение, и очередь начнет заполняться.Однако из Speaker я не только не получил сообщение об успехе, но и сообщение об ошибке.Абсолютно нет вывода, и Speaker никогда не изменял очередь.В чем причина этого?Listener автоматически блокирует очередь или что-то в этом роде?

...