Составной пользовательский сервисный сервер с использованием Twisted - PullRequest
1 голос
/ 09 декабря 2011

У меня на работе интересный проект. Задача, стоящая перед нами, такова:

  • Создание собственного сервера с использованием Python
  • Имеет часть веб-сервера, обслуживающую REST
  • Имеет часть FTP-сервера, обслуживающую файлы
  • Имеет SMTP-часть, которая принимает почту только
  • и, наконец, что не менее важно, он имеет фонового работника, который управляет IO файлов низкого уровня на основе запросов, полученных от вышеупомянутых сервисов

Очевидно, что на месте была Twisted библиотека / фреймворк, который является отличным сетевым инструментом. Однако, изучая документы дальше, я обнаружил несколько вещей, в которых я не уверен.

Имея фон Java, я бы решил задачу (по крайней мере, в начале), создав отдельный поток для каждого сервиса и перейдя оттуда. Однако, находясь в Python, я не могу этого сделать ни для каких разумных целей, поскольку в Python есть GIL. Я не уверен, как Twisted справляется с этим. Я ожидаю, что Twisted имеет большой (если не мажоритарный) код, написанный на C, где GIL не является проблемой, но я не смог найти документы, объясненные к моему удовлетворению.

Итак, самый выдающийся вопрос: учитывая, что Twisted использует Reactor в качестве основного шаблона проектирования, он сможет:

  1. Обслуживание всех необходимых услуг
  2. Делайте это неблокирующим образом (должно быть, согласно документам, но если кто-то может уточнить, я был бы благодарен)
  3. Возможность обслуживать сразу несколько сотен клиентов
  4. Обеспечивает загрузку больших файлов разумным способом, что означает, что он может обслуживать несколько клиентов, используя несколько служб, загружая и выгружая большие файлы.

Большие файлы имеют порядок сотен МБ или несколько ГБ. Размер не важен, важно время, когда клиент должен оставаться на связи с сервером.

Редактировать: Я на самом деле склонен идти по пути многопроцессорной обработки Python, но не уверен, правильно ли это делать с Twisted и т. Д.

1 Ответ

3 голосов
/ 09 декабря 2011
  • Обслуживание всех необходимых услуг

Да.

  • Делайте это неблокирующим образом (должно быть, согласно документам, но если кто-то может уточнить, я был бы благодарен)

Twisted использует общую модель реактора. I / O проходит ваш выбор опроса, выберите, что угодно, чтобы определить, доступны ли данные. Он обрабатывает только то, что доступно, и передает данные на другие этапы вашего приложения. Вот как это неблокирует.

Не думаю, что он обеспечивает неблокирующий дисковый ввод-вывод, но я не уверен. Эта особенность не нужна большинству людей, когда они говорят, что неблокирование.

  • Возможность обслуживать сразу несколько сотен клиентов

Да. Может быть Что делают эти клиенты? Каждое нажатие обновляет каждую секунду в браузере, делающем 100 запросов? Каждый из них проводит численное моделирование столкновений галактик? Каждый посылает строку "привет!" на сервер, не ожидая ответа?

Twisted может легко обрабатывать более 1000 запросов в секунду.

  • Обеспечивает загрузку больших файлов разумным способом, что означает, что он может обслуживать несколько клиентов, используя несколько служб, загружая и выгружая большие файлы.

Конечно. Например, оригинальная версия BitTorrent была написана на Twisted.

...