无法发送大文件Python

时间:2014-10-29 04:40:49

标签: python sockets send server

我正在尝试为一个类实现一个简单的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或更大的文件时会中断。

1 个答案:

答案 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.