Вызов recv()
обрабатывается напрямую путем вызова функции библиотеки C.
Он заблокирует ожидание сокета данных. На самом деле он просто разрешит системному вызову recv()
.
file.readline()
- эффективная буферизованная реализация. Это не потокобезопасно, потому что предполагает, что это единственный, кто читает файл. (Например, путем буферизации предстоящего ввода.)
Если вы используете объект файла, каждый раз, когда read()
вызывается с положительным аргументом, базовый код будет recv()
только объемом запрошенных данных, если только он не буферизован.
Будет буферизовано, если:
Таким образом, оставляя данные в буфере. В противном случае буфер обычно не переполняется.
Цель вопроса не ясна. если вам нужно проверить, доступны ли данные перед чтением, вы можете select()
или установить сокет в неблокирующий режим с помощью s.setblocking(False)
. Тогда чтение вернется пустым, а не блокированием, если нет ожидающих данных.
Вы читаете один файл или сокет с несколькими потоками? Я бы поставил одного работника на чтение сокета и подачу полученных элементов в очередь для обработки другими потоками.
Предложить консультацию Источник Python Socket Module и C Источник, который делает системные вызовы .