繁体   English   中英

python sockets 应该有多快? 为什么我的运行速度很慢?

[英]How fast are python sockets supposed to be? Why are mine running very slowly?

我编写了一个小程序,通过 sockets 发送一些数字。 我在我的电脑上运行客户端程序,在虚拟机上运行服务器程序(托管在谷歌云平台上)。 我正在使用的代码:

客户端.py:

import socket
from time import time

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(("xx.xxx.xxx.xxx", 5555))

for i in "1234567890":
    print(f"Sending {i} at time {time()}")
    client.sendall(i.encode())

    data = client.recv(64)
    print(f"Received {data.decode()} at time {time()}")

服务器.py:


import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(("0.0.0.0", 5555))
s.listen(2)

print("Server listening")

conn, addr = s.accept()
print("Connected to:", addr)

while True:
    data = conn.recv(2048).decode()
    if(not data):
        print("Server closing")
        break
    conn.sendall(data.encode())

client.py中的 output 显示,发送数据到服务器,然后接收并解码的往返过程大约需要 0.2 秒。 这对我来说似乎相当高,sockets 不应该跑得更快吗? 这篇文章看来,java 中的 tcp sockets 可以在 2微秒内完成往返,这比我的 0.2 秒快很多。 我是 sockets 的新手,所以我对任何事情都不太确定。 如果有人可以为我提供一些见解,或者就如何使 sockets 运行得更快(如果可能的话,可能是不同的模块或套接字类型?)提出建议,那就太好了。

我开始使用 sockets 是因为我想根据某人给我的教程制作一个基本的多人游戏(他的 sockets 似乎运行得非常快),但是在运行此代码之后,客户端之间将数据传输到 Z34D1F91FB2E514B88A56BZA 所需的时间似乎就像它会使游戏无法玩,或者至少非常缓慢并且根本不好玩。 我确实看到了一些关于使用 UDP 而不是 TCP 的信息,但是在尝试了某人的 UDP 示例之后,我发现它运行得一样慢。

笔记:

  1. 服务器代码在 linux 机器上
  2. 客户端代码在 windows 机器上
  3. 我的网速不错,所以我认为这不是主要问题
  4. 我尝试使用socket.TCP_NODELAY但它没有效果

只是一些别人可能会觉得有用的额外信息

您一次发送一堆小信息,而不是将它们聚合在一起并立即发送。 这迫使实施效率低下。

当传输层看到第一条数据时,它不知道第二条数据即将到来,所以它立即发送。 但是当它看到第二条数据时,它现在不知道它需要发送多少数据(因为它现在看到它不应该立即发送第一个数据),所以它等着看你是否在通过设置一个 200 毫秒的计时器来发送更多信息。

如果你有一堆东西需要同时发送,你需要组合成一个调用底层传输层。 否则,您将迫使它变得低效,因为它永远不知道何时应该发送以及何时应该积累数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM