我正在尝试为一个类实现一个简单的epoll Web服务器。一切都很好,直到我尝试发送一个大文件。我注意到它发送了大约2/3的数据然后只是坐在那里什么也没做。这就是我尝试确保发送所有数据的方式:
def sendResponse(self,fd,response):
if response:
totalsent = 0
MSGLEN = len(response)
while totalsent < MSGLEN:
sent = self.clients[fd].send(response[totalsent:])
if sent == 0:
raise RuntimeError("socket connection broken")
totalsent = totalsent + sent
else:
self.poller.unregister(fd)
self.clients[fd].close()
del self.clients[fd]
我是否在小到中等大小的文件中提到过它。我只是注意到它在尝试发送1.7 Mbs或更大的文件时会中断。
答案 0 :(得分:0)
如果可以的话,请跳过重新发明轮子和轮胎的阶段。使用ZeroMQ消息传递层。
通过这种方式,您的代码可能会忘记所有低杠杆的精确度和您的开发时间&amp;专注于您的问题领域问题。 ZeroMQ提供了一个概念和一套现成的工具,用于添加(几乎) - 线性 - 可扩展性,资源池,故障恢复,更高层抽象协议等等。
对于最初的一块蛋糕,请尝试Nicholas Piel
的视图与Pieters Hintjens的书一起度过一周&#34; Code Connected,Vol.1&#34;将为您介绍分布式处理的新世界,您已准备就绪,只需准备好重新使用The Masters的专业知识。
你得到了什么?
一个恶魔般的快速,无论是几个字节还是几GB GB BLOB,低延迟等等,所有这些都来自这样简单的代码:
def sendResponse( self, aZmqConnectionToCounterparty, response ):
if response:
try:
aZmqConnectionToCounterparty.send( response, zmq.NOBLOCK )
except ZMQerror:
''' handle ZMQerror '''
except ValueError:
''' handle ValueError '''
except TypeError:
''' handle TypeError '''
...
PyZMQ文档内容如下:
.send( data, flags = 0, copy = True, track = False )
Send a message on this socket.
This queues the message to be sent by the IO thread at a later time.
Parameters:
-----------
data: object, str, Frame The content of the message.
flags: int Any supported flag: NOBLOCK, SNDMORE.
copy: bool Should the message be sent in a copying or non-copying manner.
track: bool Should the message be tracked for notification
that ZMQ has finished with it? ( ignored if copy = True )
Returns:
--------
None: if copy or not track
None if message was sent, raises an exception otherwise.
MessageTracker: if track and not copy
a MessageTracker object, whose pending property will be True until the send is completed.
Raises:
-------
TypeError If a unicode object is passed
ValueError If track=True, but an untracked Frame is passed.
ZMQError If the send does not succeed for any reason.