#!/usr/bin/env python3

import selectors
import socket

poll = selectors.DefaultSelector ()
clients = set ()

def accept (server, mask):
    if mask & selectors.EVENT_READ:
        while True:
            try:
                conn, addr = sock.accept ()
            except BlockingIOError:
                break
            conn.setblocking (False)
            poll.register (conn, selectors.EVENT_READ, read)
            clients.add (conn)
        mask &=~ selectors.EVENT_READ
    assert mask == 0

def read (conn, mask):
    if mask & selectors.EVENT_READ:
        while True:
            try:
                data = conn.recv (4096)
            except BlockingIOError:
                break
            if not data:
                poll.unregister (conn)
                clients.remove (conn)
                conn.close ()
                break
            else:
                for x in clients:
                    x.send (data)  # Hope it won't block
        mask &=~ selectors.EVENT_READ
    assert mask == 0

sock = socket.socket ()
sock.bind (('0.0.0.0', 17241))
sock.listen (10)
sock.setblocking (False)  # Важно!
poll.register (sock, selectors.EVENT_READ, accept)

while True:
    events = poll.select ()
    for key, mask in events:
        callback = key.data
        callback (key.fileobj, mask)