Python matplotlib读取udp数据多线程
我认为这是一个有趣的问题。我目前正在从一个客户端读取UDP数据,该客户端的逐行输出如下所示:Python matplotlib读取udp数据多线程,python,multithreading,matplotlib,udp,latency,Python,Multithreading,Matplotlib,Udp,Latency,我认为这是一个有趣的问题。我目前正在从一个客户端读取UDP数据,该客户端的逐行输出如下所示: X,-3.6958605654872471e+001,Y,-1.6998255581789078e+001,Z,-8.2844374603286042e+000 X,-3.6958587424752295e+001,Y,-1.6998317167303274e+001,Z,-8.2844126284670612e+000 X,-3.6958772663292550e+001,Y,-1.699842523
X,-3.6958605654872471e+001,Y,-1.6998255581789078e+001,Z,-8.2844374603286042e+000
X,-3.6958587424752295e+001,Y,-1.6998317167303274e+001,Z,-8.2844126284670612e+000
X,-3.6958772663292550e+001,Y,-1.6998425235838699e+001,Z,-8.2842123939323624e+000
下一步是从服务器读取原始数据,并在3d散点图上实时绘制数据。我已经找到了有关Stackoverflow的相关答案。但这些答案很简单,因为在for
循环中,每个索引只创建一个点
这是我的服务器的代码
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import socket
UDP_IP_ADDRESS = ''
UDP_PORT_NO = 5005
serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))
print "Server started from port:", UDP_PORT_NO
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
plt.ion()
while True:
raw_data, addr = serverSock.recvfrom(4096)
x,y,z = parse_data(raw_data) #parse line into 3 distinct values
ax.scatter(x, y, z)
plt.pause(0.0001)
正如你所看到的,我正在以最快的速度阅读要点,这就提出了一个问题
python可以一次接收一个点吗?还是应该为每个parse_data()
调用启动一个线程,以便可以绘制所有点?但是,如果我使用线程,那么我担心竞争条件可能会导致绘制的点以错误的顺序绘制。解决方案可能需要我使用消息队列和互斥锁
什么样的解决方案可以保证传入消息的顺序并提供最低的延迟?对不起,您能在此澄清问题吗?这是因为你在任何时候只有一个点在绘图上,或者你不能足够快地绘图来满足传入的请求?这是因为我不能足够快地绘图,这对我来说意味着我可能需要旋转一个单独的线程来跟上传入的数据我真的怀疑线程是否能帮助你加快速度;GIL确保一次只执行一个线程。我认为这将通过mpl一路传播。另外,你是如何绘制图的?可能会有一个更适合的库,尤其是在浏览器中。有趣的问题。您正在使用UDP套接字。您已经失去了任何订购保证。您确定到达后必须立即查看每个数据点吗?将绘图更新分为每秒一次或几次将更加有效,特别是考虑到在许多新的更新到达之前,您可能无法对任何一点做出反应。对不起,您能在这里澄清问题吗?这是因为你在任何时候只有一个点在绘图上,或者你不能足够快地绘图来满足传入的请求?这是因为我不能足够快地绘图,这对我来说意味着我可能需要旋转一个单独的线程来跟上传入的数据我真的怀疑线程是否能帮助你加快速度;GIL确保一次只执行一个线程。我认为这将通过mpl一路传播。另外,你是如何绘制图的?可能会有一个更适合的库,尤其是在浏览器中。有趣的问题。您正在使用UDP套接字。您已经失去了任何订购保证。您确定到达后必须立即查看每个数据点吗?将绘图更新分批处理为每秒一次或几次会更有效率,特别是考虑到在许多新点到达之前,您可能无法对任何一点做出反应。