Почему сокет UDP занимает так много времени в Python? - PullRequest
0 голосов
/ 22 ноября 2018


пока я тестирую сокеты в python, мне интересно, почему для завершения процесса отправки и получения UDP требуется так много времени.(это занимает около 2 мс на контакт ЛОКАЛЬНО с моим кодом, просто слишком медленно использовать его для связи между процессами или потоками)

Я что-то не так делаю? (запустить в одном потоке иличто-то?) Или потому, что питон просто такой медленный?

Пример демонстрационного кода сервера:

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 голосов
/ 22 ноября 2018

Я получаю примерно на два порядка быстрее, чем это (~ 0,01 мс, 3,4 ГГц, 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 могут быть быстрее, если вы меньше заботитесь о переносимости, в противном случае вы можете попробовать zeromq с хорошими пакетами Python

...