Pull to refresh

Comments 17

Asyncio — лишь один из способов добиться асинхронности.
Конечно, но пост оформлен так, что неопытные читатели могут подумать, что все пишут асинхронный код как в этом посте, и получается не очень хорошо
Ранее мы использовали опцию server_socket.listen(10) для настройки сервера. Она означает ограничение на количество единовременных подключений к серверному сокету.

Это не совсем так. Этот параметр означает максимальный размер очереди из еще не принятых подлючений (ожидающих соответствующего server_socket.accept()). Количество одновременно-активных подключений ограничено совсем другими факторами.
docs.python.org/3/library/socket.html#socket.socket.listen
Отличное замечание! Спасибо, сейчас поправлю.

Select?
А разве для реальной работы (помимо учебных примеров) его ещё используют?
На крайний случай сразу бы уж poll. Оно хоть тоже не без недостатков, но с него уже проще двигаться в сторону современных epoll/kqueue или iocp (если под виндой).

Спасибо! Хорошее замечание. Действительно, select уже устарел. Но он до сих пор часто используется в качестве примеров в других источниках (вероятно из-за своей простоты). Я не стал отходить от традиций.
Используется он из-за переносимости, select есть во всех операционных системах. Если бы ваш пример использовал poll, запустить его в Windows было бы невозможно.
Я не понял, в чём здесь новизна? Что здесь такого особенного? Ну сервер, ну асинхронный…
Такого добра здесь уже написано много.
Как и многие другие источники(книги, статьи, туториалы и т.д.) данная статья представляет собой компиляцию уже существующих идей и собственного видения с опытом. Я не ставил целью открыть колесо. Мне просто хотелось поделиться существующими знаниями на случай, если кому-то это пригодится.
Мне кажется большая вариация статей на одну тему — не так уж и плохо. Посмотрите какое количество учебников, статей, видео курсов по математическому анализу существует. Тем не менее до сих есть люди, которые пишут новые. Мне кажется, это отлично.
Не буду спорить. Соглашусь.
Если запросы к асинхронному серверу не сильно CPU-тяжелые то такую задачу можно сделать на nodejs.

На CoffeScript будет выглядеть так:
net = require 'net'

server = net.createServer (socket) ->
    [addr, port] = [socket.remoteAddress, socket.remotePort]
    console.log "Client from #{addr}:#{port} connected."

    talk = ->
        socket.end('Bye!')

    socket.on "data", (data) ->
        console.log "Received from #{addr}: #{data.toString()}"
        setTimeout talk, Math.random() * 2000
    
    socket.on "end", ->
        console.log "Client from #{addr}:#{port} disconnected"
    
    socket.on "error", (e) ->
        console.log e.toString()

server.listen 8080, ->
    console.log "Listening on #{server.address().port} ..."


Кстати приятнее выглядит, чем работа со встроенными сокетами Питона. Несёт он тяжкое своё бремя обратной совместимости.
Кстати, знает кто-нибудь нормально обёрнутые таким образом сокеты для Пайтона?

Статье, кстати, не хватает хотябы кратенького обзора самых распространённых фреймворков и библиотек для написания асинхронных серверов. Я бы обмолвился о таких релевантных пакетах как: aiohttp, tornado, asyncio и т.д.
Стоило бы ещё в двух словах рассказать об особенностях их внутренней реализации по сравнению с рассмотренными в статье примерами.
Статья вполне годится, чтобы добавить в закладки "для новичков", но если кому скинуть — сразу прибегут за объяснениями что за select. Об этом бы тоже не мешало поподробнее.

Привет! Статья совсем не про python и не про языки программирования. Изначально я хотел написать примеры на Java, но получилось как-то много специфичного для языка (например, проверяемые исключения). Спасибо за замечание.
В примере с синхронным сервером на сокет ставится ограничение в 10 непринятых соединений, а клиент пытается открыть сразу 20, еще до начала передачи данных, так что они друг друга заблокируют.
Недостаточно хорошо знакомые с тематикой могут удивиться :)
Sign up to leave a comment.