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