为什么UDP套接字在Python中需要这么长时间?

时间:2018-11-22 17:04:25

标签: python performance sockets websocket udp


当我在python中测试套接字时,我想知道为什么花这么长时间才能完成UDP发送和接收过程。 (每次与我的代码本地联系大约需要2毫秒,使用它在进程或线程之间进行通信太慢了)

我做错了什么吗?(​​在单线程中运行还是其他?)还是因为python这么慢?

服务器演示代码如下:

import socket,time

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind('localhost',6000)

while True:
    data, addr = s.recvfrom(1024)
    s.sendto(b'',addr)

客户就是这样:

import socket,time

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)\

for i in range(100):
    t = time.time()
    s.sendto('localhost',6000)
    s.recv(1024)
    print(time.time() - t)

输出如下:

0.00799250602722168
0.0020029544830322266
0.0010268688201904297
0.0010089874267578125
0.0010042190551757812
0.0020051002502441406
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.002005338668823242
0.0020051002502441406
0.0020058155059814453
0.0027120113372802734
0.0010039806365966797
0.0020055770874023438
0.00200653076171875
0.002003908157348633
0.0010035037994384766
0.0020051002502441406
0.0020074844360351562
0.0010325908660888672
0.002005338668823242
0.002690553665161133
0.0010037422180175781
0.0020055770874023438
0.0020051002502441406
0.002005338668823242
0.002005338668823242
0.001806020736694336
0.0010192394256591797
0.0010271072387695312
0.0020055770874023438
0.002007007598876953
0.0020041465759277344
0.002004861831665039
0.001999378204345703
0.0020067691802978516
0.0019817352294921875
0.002007007598876953

有人可以解决我的问题吗? 非常感谢

1 个答案:

答案 0 :(得分:0)

我得到的速度比那快约两个数量级(〜0.01ms,3.4GHz i7-6700),也许localhost解决了一个奇怪的地方,需要重试吗?

您的代码也对我不起作用,正在发布我使用的代码。服务器端优先:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
  s.bind(('localhost',6000))
  while True:
    data, addr = s.recvfrom(1024)
    s.sendto(b'',addr)

现在是客户端:

import socket
from time import time

addr = socket.getaddrinfo(
  'localhost', 6000,
  socket.AF_INET, socket.SOCK_DGRAM)[0]

with socket.socket(*addr[:3]) as s:
  s.connect(addr[4])
  for i in range(1000):
    t1 = time()
    s.send(b'')
    t2 = time()
    s.recv(1024)
    t3 = time()
    if i % 100 == 0:
      print('{:.3f}ms {:.3f}ms'.format((t2 - t1) * 1000, (t3 - t2) * 1000))

请注意,我使用socket.connect()来尝试减少解析时间,但这似乎对我没有任何影响。我得到:

0.218ms 0.006ms
0.004ms 0.010ms
0.004ms 0.007ms
0.004ms 0.008ms
0.004ms 0.011ms
0.004ms 0.010ms
0.004ms 0.010ms
0.004ms 0.009ms
0.004ms 0.010ms
0.004ms 0.008ms

后退,即第一次运动很慢,然后很快

如果您不太关心可移植性,unix域套接字可能会更快,否则,您可以尝试具有zeromqnice Python packages