我正在编写python代码,使用TCP / IP套接字或UNIX域套接字来同步worker和master。
在这些套接字上传输的数据是双向的,不经常发送,但是很大(400MB~)。处理程序中的速度服务器 - >客户端足够快(20秒),但另一种方式是无法忍受的(40分钟!)
你是否有任何线索为什么套接字通过“接受”服务器发送速度更快,或者另一个更快接收,我甚至都不知道。
以下是客户端的连接方式:
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
if use_tcp:
self.sock.connect((host, websocket_port))
else:
self.sock.connect(unix_socket)
self.wfile = self.sock.makefile('wb', 0)
self.sock.sendall("connect")
self.request_parameters()
except:
raise
并发送数据
print("Sending %d bytes of data..." % sys.getsizeof(serialized))
try:
self.wfile.write("once" + serialized + "end")
self.wfile.flush()
print("Written and sent...")
except Exception,e:
print("Too large to be sent? :'(")
print(e)
服务器是SocketServer one:
class TCPUnixServer(ss.TCPServer):
address_family = socket.AF_UNIX
def __init__(self, addr, handler):
try:
os.unlink(addr)
except OSError:
if os.path.exists(addr):
raise
ss.TCPServer.__init__(self, addr, handler)
def start_parameter_server(model, num_epochs, warmup_data=None, test_data=None):
if use_tcp:
server = ss.TCPServer(unix_socket, ParameterServerWebsocketHandler)
else:
server = TCPUnixServer(unix_socket, ParameterServerWebsocketHandler)
要读取数据,客户端和服务器都会这样做:
while True:
rcv = self.sock.recv(4096)
if rcv.endswith("end"):
parameters += rcv.rstrip("end")
break
parameters += rcv