У меня на работе интересный проект. Задача, стоящая перед нами, такова:
- Создание собственного сервера с использованием Python
- Имеет часть веб-сервера, обслуживающую REST
- Имеет часть FTP-сервера, обслуживающую файлы
- Имеет SMTP-часть, которая принимает почту только
- и, наконец, что не менее важно, он имеет фонового работника, который управляет IO файлов низкого уровня на основе запросов, полученных от вышеупомянутых сервисов
Очевидно, что на месте была Twisted библиотека / фреймворк, который является отличным сетевым инструментом. Однако, изучая документы дальше, я обнаружил несколько вещей, в которых я не уверен.
Имея фон Java, я бы решил задачу (по крайней мере, в начале), создав отдельный поток для каждого сервиса и перейдя оттуда. Однако, находясь в Python, я не могу этого сделать ни для каких разумных целей, поскольку в Python есть GIL. Я не уверен, как Twisted справляется с этим. Я ожидаю, что Twisted имеет большой (если не мажоритарный) код, написанный на C, где GIL не является проблемой, но я не смог найти документы, объясненные к моему удовлетворению.
Итак, самый выдающийся вопрос: учитывая, что Twisted использует Reactor в качестве основного шаблона проектирования, он сможет:
- Обслуживание всех необходимых услуг
- Делайте это неблокирующим образом (должно быть, согласно документам, но если кто-то может уточнить, я был бы благодарен)
- Возможность обслуживать сразу несколько сотен клиентов
- Обеспечивает загрузку больших файлов разумным способом, что означает, что он может обслуживать несколько клиентов, используя несколько служб, загружая и выгружая большие файлы.
Большие файлы имеют порядок сотен МБ или несколько ГБ. Размер не важен, важно время, когда клиент должен оставаться на связи с сервером.
Редактировать: Я на самом деле склонен идти по пути многопроцессорной обработки Python, но не уверен, правильно ли это делать с Twisted и т. Д.