Python. RealTime 2d graphic extend
Я пишу код на Python 3.9 для обновления графика в реальном времени. Суть в следующем: есть два потока, один принимает по сокету новый фрейм (вектор из 10 отсчетов), который должен расширить график, который отрисовывается во втором потоке, при получении нового фрейма.
На данный момент есть следующая реализация:
import socket as soc
import pickle
import matplotlib.pyplot as plt
import numpy as np
import threading as trd
vec_mux = trd.Lock()
vec = []
def up_frame(fd_soc):
global vec
frame = []
for i in range(10):
vec_mux.acquire()
data = fd_soc.recv(640)
frame[9:0] = pickle.loads(data)
vec.extend(frame[0:9])
vec_mux.release()
def fr_plot():
global vec
plt.ion()
for i in range(10):
vec_mux.acquire()
plt.clf()
plt.plot(vec)
plt.draw()
plt.gcf().canvas.flush_events()
vec_mux.release()
plt.ioff()
plt.show()
import os
HOST_NAME = 'localhost'
HOST_PORT = 12345
HOST = (HOST_NAME,HOST_PORT)
if __name__ == '__main__':
rec_soc = soc.socket(soc.AF_INET,soc.SOCK_STREAM)
rec_soc.bind(HOST)
rec_soc.listen(1)
try:
fd_soc,fd_add = rec_soc.accept()
except Exception as exp:
print(f'Error while accepting: {exp}')
rec_sock.close()
os.system('pause')
raise SystemExit#!!!
up_trd = trd.Thread(target=up_frame,args=(fd_soc,))
fr_trd = trd.Thread(target=fr_plot,)
up_trd.start()
fr_trd.start()
up_trd.join()
fr_trd.join()
fd_soc.close()
rec_soc.close()
os.system('pause')
Передатчик на данный момент имитируется следующим кодом:
import socket as soc
import pickle
import numpy as np
import threading as trd
import time
fr_mux = trd.Lock()
frame = []
def up_frame(vec):
global frame
for i in range(10):
fr_mux.acquire()
frame = vec[10*i:10*i+10]
fr_mux.release()
def fd_frame(tgt_soc):
global frame
while True:
fr_mux.acquire()
try:
tgt_soc.send(pickle.dumps(frame))
frame = []
except Exception as exp:
print(f'Error while sending frame: {exp}')
break
finally:
fr_mux.release()
import os
HOST_NAME = 'localhost'
HOST_PORT = 12345
HOST = (HOST_NAME,HOST_PORT)
vec = np.mod(np.linspace(0,1,100) * 10, 1)
if __name__ == '__main__':
fd_soc = soc.socket(soc.AF_INET, soc.SOCK_STREAM)
try:
fd_soc.connect(HOST)
except Exception as exp:
print(f'Error while connection to host: {exp}')
fd_soc.close()
os.system('pause')
raise SystemExit#!!!
up_trd = trd.Thread(target=up_frame,args=(vec,))
fd_trd = trd.Thread(target=fd_frame,args=(fd_soc,))
up_trd.start()
fd_trd.start()
up_trd.join()
fd_trd.join()
fd_soc.close()
os.system('pause')
Проблема этой реализации в том, что отрисовка графика происходит после получения всех фреймов. Как починить код приемника?