# gevent

# Example geventsendfile.py

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

    """An example how to use sendfile[1] with gevent.

    [1] http://pypi.python.org/pypi/py-sendfile/
    """
    # pylint:disable=import-error
    from errno import EAGAIN
    from sendfile import sendfile as original_sendfile
    from gevent.socket import wait_write

    def gevent_sendfile(out_fd, in_fd, offset, count):
        total_sent = 0
        while total_sent < count:
            try:
                _offset, sent = original_sendfile(out_fd, in_fd, offset + total_sent, count - total_sent)
                #print('%s: sent %s [%d%%]' % (out_fd, sent, 100*total_sent/count))
                total_sent += sent
            except OSError as ex:
                if ex.args[0] == EAGAIN:
                    wait_write(out_fd)
                else:
                    raise
        return offset + total_sent, total_sent

    def patch_sendfile():
        import sendfile
        sendfile.sendfile = gevent_sendfile

Current source

Next page: Example portforwarder.py