传入的UDP数据包排队,然后使用Python集中在一起

时间:2013-05-08 21:07:03

标签: python performance udp

我使用UDP和Android通过无线网络发送数据包,并使用Python接收。我正在发送相当时间敏感的数据,我遇到的问题是数据包没有足够快/正确读取。基本上,为了衡量实际问题,我测量连续数据包之间的时间。下面是一系列数据包,它们每20毫秒从其他应用程序发送一次。

正如你所看到的,围绕数据包19的事情开始变得混乱。有50毫秒的延迟,然后立即读取下一个连续的数据包,就像它们已经到达一样。数据包40很好地证明了它实际上有多糟糕。自上一个数据包起110毫秒,然后在2毫秒内发送4个数据包。

我已经与Wireshark验证了数据包实际上是经常发送的(所以问题似乎与其他应用程序无关)

我的问题是这些,请回答最合适的问题:

  1. 我该怎么做才能解决问题,或者我应该采取哪些其他步骤来分析它?
  2. 是否有可用的套接字选项可以帮助我?
  3. 我在做Python UDP错了吗?
  4. 以下是描述数据包流的简单图表。下面是我用来读取UDP数据包的python代码。

    N   (ms)
    1    21
    2    21
    3    19
    4    21
    5    20
    6    19
    7    20
    8    19
    9    20
    10   18
    11   21
    12   20
    13   21
    14   20
    15   19
    16   20
    17   25
    18   18
    19   50
    20   0.23
    21   08
    22   29
    23   09
    24   21
    25   26
    26   18
    27   83
    28   0.21
    29   0.35
    30   0.75
    31   23
    32   70
    33   1.21
    34   0.23
    35   0.21
    36   20
    37   22
    38   11
    39   20
    40   110
    41   0.69
    42   0.42
    43   0.44
    44   0.39
    45   13
    

    这是网络代码。 self.callback将消息放入python队列,另一个线程从中读取。我正在使用CPython 3.3。问题至少还有2台计算机(相同的症状,我没有用Wireshark验证或测量时间)

    self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
    def start(self):
        while 1:
            try:
                received_data, address = self.socket.recvfrom(576)
                received_time = time.perf_counter()
    
                if self.is_correct_protocol(received_data):
                    seq_id = struct.unpack(">H", received_data[4:6])[0]
    
                    if self.test_already_acknowledged(address, seq_id):
                        if not self.check_and_handle_ping_request(address, unpack(received_data), received_time):                            
                            self.callback(address, received_time, unpack(received_data))
    

0 个答案:

没有答案