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')

Проблема этой реализации в том, что отрисовка графика происходит после получения всех фреймов. Как починить код приемника?


Ответы (0 шт):