You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
# Неблокирующий ввод/вывод, обучающий пример
|
|
import socket
|
|
import select
|
|
|
|
sock = socket.socket()
|
|
sock.bind(("", 10001))
|
|
sock.listen()
|
|
|
|
# как обработать запросы для conn1 и conn2
|
|
# одновременно без потоков?
|
|
conn1, addr = sock.accept()
|
|
conn2, addr = sock.accept()
|
|
|
|
conn1.setblocking(0)
|
|
conn2.setblocking(0)
|
|
|
|
epoll = select.epoll()
|
|
epoll.register(conn1.fileno(), select.EPOLLIN | select.EPOLLOUT)
|
|
epoll.register(conn2.fileno(), select.EPOLLIN | select.EPOLLOUT)
|
|
|
|
conn_map = {
|
|
conn1.fileno(): conn1,
|
|
conn2.fileno(): conn2,
|
|
}
|
|
|
|
# Неблокирующий ввод/вывод, обучающий пример
|
|
# Цикл обработки событий в epoll
|
|
|
|
while True:
|
|
events = epoll.poll(1)
|
|
|
|
for fileno, event in events:
|
|
if event & select.EPOLLIN:
|
|
# обработка чтения из сокета
|
|
data=conn_map[fileno].recv(1024)
|
|
print(data.decode("utf8"))
|
|
|
|
elif event & select.EPOLLOUT:
|
|
# обработка записи в сокет
|
|
conn_map[fileno].send("pong".encode("utf8")) |