0Pricing
Linux Networking & TCP/IP for Developers · درس

المقابس غير الحاجبة وselect()

تعامل مع اتصالات متعددة ضمن عملية Python واحدة باستخدام المقابس غير الحاجبة ووحدة select لتحقيق تعدد إدخال وإخراج قابل للتوسع.

المقابس غير الحاجبة وselect() درس مجاني في Linux Networking & TCP/IP for Developers على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Linux Networking & TCP/IP for Developers، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Linux Networking & TCP/IP for Developers 4 دروس في المجموع.

بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.

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 sockets
  • select() to discover ready sockets
  • accept on the listening socket, recv on clients
  • Scale up with poll, epoll, or the selectors module

This builds on your TCP and UDP socket lessons toward scalable network services.

الأسئلة الشائعة

هل درس «المقابس غير الحاجبة وselect()» مجاني؟

نعم — نص درس «المقابس غير الحاجبة وselect()» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Linux Networking & TCP/IP for Developers، انتقل إلى CoddyKit PRO. تتضمن دورة Linux Networking & TCP/IP for Developers 4 دروس في المجموع.

ماذا ستتعلم في «المقابس غير الحاجبة وselect()»؟

تعامل مع اتصالات متعددة ضمن عملية Python واحدة باستخدام المقابس غير الحاجبة ووحدة select لتحقيق تعدد إدخال وإخراج قابل للتوسع. تتمرن على Linux Networking & TCP/IP for Developers مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Linux Networking & TCP/IP for Developers؟

لا تُشترط خبرة سابقة. Linux Networking & TCP/IP for Developers على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «المقابس غير الحاجبة وselect()»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Linux Networking & TCP/IP for Developers هذا؟

نعم. كل درس في Linux Networking & TCP/IP for Developers يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مقدمة إلى Socket API
  2. مقابس عميل-خادم TCP
  3. مقابس عميل-خادم UDP
  4. المقابس غير الحاجبة وselect()
← العودة إلى Linux Networking & TCP/IP for Developers