Engellemesiz Soketler ve select()
Ölçeklenebilir G/Ç çoklama için engellemesiz soketleri ve select modülünü kullanarak tek bir Python işleminde birden çok bağlantıyı yönetin.
Engellemesiz Soketler ve select(), CoddyKit'te ücretsiz bir Linux Networking & TCP/IP for Developers dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Linux Networking & TCP/IP for Developers öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Linux Networking & TCP/IP for Developers kursu toplamda 4 dersten oluşur.
Bu dersin bazı bölümleri henüz çevrilmemiş olup İngilizce olarak gösterilmektedir.
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.
Sıkça Sorulan Sorular
“Engellemesiz Soketler ve select()” dersi ücretsiz mi?
Evet — “Engellemesiz Soketler ve select()” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Linux Networking & TCP/IP for Developers kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Linux Networking & TCP/IP for Developers kursu toplamda 4 dersten oluşur.
“Engellemesiz Soketler ve select()” dersinde ne öğreneceğim?
Ölçeklenebilir G/Ç çoklama için engellemesiz soketleri ve select modülünü kullanarak tek bir Python işleminde birden çok bağlantıyı yönetin. Linux Networking & TCP/IP for Developers ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Linux Networking & TCP/IP for Developers öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Linux Networking & TCP/IP for Developers, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Engellemesiz Soketler ve select()” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Linux Networking & TCP/IP for Developers dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Linux Networking & TCP/IP for Developers dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Soket API'sine Giriş
- TCP İstemci-Sunucu Soketleri
- UDP İstemci-Sunucu Soketleri
- Engellemesiz Soketler ve select()