Запуск сокета Scatter/gather в Python

В POSIX C мы можем использовать writev для записи сразу нескольких массивов в дескриптор файла. Это полезно, когда вам приходится конкатенировать несколько буферов, чтобы сформировать одно сообщение для отправки через сокет (например, заголовок и тело HTTP). Таким образом, мне не нужно дважды вызывать send, один раз для заголовка и один раз для тела (что предотвращает разделение сообщений в разных кадрах на проводе), и мне не нужно конкатенировать буферы перед отправкой.

Мой вопрос в том, есть ли эквивалент Python?

Ответ 1

В предстоящем Python 3.3, теперь в альфа-тестировании. См. socket.sendmsg.

Ответ 2

  • Python поддерживает os.writev(), а также sendmsg(). Эти функции являются атомарными, поэтому эквивалент вызовов write() и send() соответственно с конкатенированным буфером.

  • Существует TCP_CORK. Вы можете сказать, что ядро ​​не посылает частичные кадры до тех пор, пока они не будут закодированы.

Используя любой из этих методов, вы можете иметь контроль над частичными кадрами TCP.