2016-10-20 12 views
1

Я собираюсь создать веб-сервер, который может получать много соединений. Эти 10000 подключенных пользователей отправят на номера серверов, и сервер вернет эти квадратные числа пользователям. 10000 соединений слишком много, и здесь необходим асинхронный подход. я нашел две библиотеки для Python 3.4, которые могут помочь:Какую библиотеку Python я должен использовать? SocketServer или Asyncio?

SocketServer & asyncio

С SocketServer библиотекой можно использовать ThreadingMixIn и ForkingMixIn классы как асинхронные обработчик. Но это ограничено количеством ядер. С другой стороны, у нас есть асинхронная библиотека. И я не понимаю, как это работает. Какой я должен использовать? И могут ли эти две библиотеки работать вместе?

ответ

5

Существуют различные подходы к асинхронному программированию.

Первый подход - контролировать операции ввода-вывода с использованием потоков и управлять этими операциями неблокируемым образом. Это то, что делает SocketServer.

Второй подход заключается в мониторинге операций ввода-вывода в основном потоке с использованием цикла событий и selector. Обычно это означает, что люди говорят о асинхронном программировании, и вот что такое asyncio, twisted и gevent do.

однопоточный подход имеет два преимущества:

  • это ограничивает риск гонки условия, поскольку обратные вызовы выполняются в том же потоке
  • он избавляется от накладных расходов на создание одного потока на одного клиента (см. 10K problem)

Приведен пример asyncio TCP server (for python 3.5). В вашем случае, просто замените handle_echo сопрограмму с вашей собственной реализации:

async def handle_client(reader, writer): 
    data = await reader.readline() 
    result = int(data.decode().strip()) ** 2 
    writer.write(str(result)).encode()) 
    writer.close() 

должна легко быть в состоянии обрабатывать тысячи клиентов.

Смежные вопросы