当我在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
有人可以解决我的问题吗? 非常感谢
答案 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域套接字可能会更快,否则,您可以尝试具有zeromq的nice Python packages