Sockets sem bloqueio e select()
Gerencie várias conexões em um único processo Python usando sockets sem bloqueio e o módulo select para multiplexação escalável de E/S.
Sockets sem bloqueio e select() é uma aula grátis de Linux Networking & TCP/IP for Developers no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Linux Networking & TCP/IP for Developers, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Linux Networking & TCP/IP for Developers inclui 4 aulas no total.
Partes desta aula ainda não foram traduzidas e aparecem em inglês.
The Blocking Problem
A simple recv() call blocks until data arrives. A single-threaded server can therefore only serve one client at a time.
To handle many clients without threads, we use non-blocking sockets combined with an I/O multiplexer like select().
Making a Socket Non-Blocking
Call setblocking(False) on a socket. Now recv() and send() return immediately, raising BlockingIOError if they would have blocked.
import socket
s = socket.socket()
s.setblocking(False)
print('blocking mode:', s.getblocking())Introducing select()
select.select() watches lists of sockets and tells you which are ready.
It takes three lists: read, write, and error, and returns the subsets that are ready.
import select
readable, writable, errored = select.select(inputs, outputs, inputs)The Server Setup
Create a listening socket, set it non-blocking, and add it to the inputs list. The listening socket becoming 'readable' means a new connection is waiting.
server = socket.socket()
server.setblocking(False)
server.bind(('localhost', 9000))
server.listen()
inputs = [server]Accepting New Connections
When the listening socket is in the readable list, call accept(). Make the new client socket non-blocking and add it to inputs too.
if s is server:
conn, addr = server.accept()
conn.setblocking(False)
inputs.append(conn)Reading from Clients
For any other readable socket, call recv(). An empty bytes result means the client closed the connection, so remove it from inputs and close it.
data = s.recv(1024)
if data:
print('got', data)
else:
inputs.remove(s)
s.close()The Full Event Loop
Wrap accept and read logic in a while True loop driven by select(). This is the heart of an event-driven server.
while inputs:
readable, _, _ = select.select(inputs, [], [])
for s in readable:
handle(s)Handling Writes
For high-throughput servers you also track the writable list. Only send when the OS says the socket can accept data, avoiding partial-send stalls.
readable, writable, _ = select.select(inputs, outputs, [])
for s in writable:
s.send(pending[s])Beyond select: poll and epoll
select() is limited by the FD_SETSIZE constant and scans all sockets each call.
For thousands of connections, Linux offers select.poll() and the more scalable select.epoll(), which scale far better.
Where selectors Fits In
The high-level selectors module wraps the best available backend (epoll/kqueue) behind one API. Most production code uses it instead of raw select.
import selectors
sel = selectors.DefaultSelector()
sel.register(server, selectors.EVENT_READ)Timeouts
Passing a timeout to select() lets the loop wake periodically even with no I/O, useful for housekeeping. A timeout of 0 polls without blocking.
readable, _, _ = select.select(inputs, [], [], 1.0)
if not readable:
print('no activity this second')Quick Check
Test your multiplexing knowledge.
Recap
You can now build a single-threaded multi-client server:
setblocking(False)for non-blocking socketsselect()to discover ready sockets- accept on the listening socket, recv on clients
- Scale up with
poll,epoll, or theselectorsmodule
This builds on your TCP and UDP socket lessons toward scalable network services.
Perguntas Frequentes
A aula “Sockets sem bloqueio e select()” é grátis?
Sim — o texto completo de “Sockets sem bloqueio e select()” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Linux Networking & TCP/IP for Developers, atualize para CoddyKit PRO. O curso de Linux Networking & TCP/IP for Developers inclui 4 aulas no total.
O que vou aprender em “Sockets sem bloqueio e select()”?
Gerencie várias conexões em um único processo Python usando sockets sem bloqueio e o módulo select para multiplexação escalável de E/S. Você pratica Linux Networking & TCP/IP for Developers com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Linux Networking & TCP/IP for Developers?
Nenhuma experiência prévia é necessária. Linux Networking & TCP/IP for Developers no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Sockets sem bloqueio e select()”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Linux Networking & TCP/IP for Developers?
Sim. Cada aula de Linux Networking & TCP/IP for Developers inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Introdução à API de Sockets
- Sockets TCP Cliente-Servidor
- Sockets UDP Cliente-Servidor
- Sockets sem bloqueio e select()