Как породить долго-запущенные процессы в Twisted - PullRequest
0 голосов
/ 27 августа 2011

Предисловие

Я пишу веб-сервер, который дает пользователям доступ к некоторой программе, написанной на C (я использую оболочку Python поверх этой C-программы,это PyCLIPS ).Чтобы обслуживать много пользователей, веб-сервер должен запускать много копий этой C-программы, потому что одна копия может одновременно обслуживать очень мало пользователей, около 1-3 пользователей.Кроме того, каждый пользователь должен работать только со своей копией, поэтому должно быть много копий C-программы.

Эта C-программа является движком CLIPS , если это поможет понять.


Итак, для решения этой проблемы проектированияЯ хочу написать Twisted TCP-сервер, который будет похож на пул долго выполняющихся процессов.Каждый из долго выполняющихся процессов представляет собой небольшой Twisted TCP-сервер, который предоставляет доступ к одной копии C-программы.

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


Вопросы

  1. Как запустить этот длительный процесс с пула-сервера?Сервер пула и каждый из длительных процессов должны быть отдельными серверами Twisted.
  2. Является ли Twisted хорошим выбором для этих целей?
  3. Может быть, есть и другие способы решения этой проблемы проектирования.?

Большое спасибо.

1 Ответ

4 голосов
/ 27 августа 2011

Использование Twisted для этого звучит так, как будто имеет смысл.Низкоуровневым API, поддерживающим запущенные процессы в Twisted, является pipeline.spawnProcess .Некоторые примеры его использования приведены в документе howto .

Этот API хорошо подходит для работы со многими долго выполняющимися процессами и, как и со всеми API ввода / вывода в Twisted, онхорошо работает в сочетании с другим источником событий, таким как веб-сервер , который пользователи могут использовать для запроса запуска новых процессов.

reactor.spawnProcess больше похож на модуль стандартной библиотеки подпроцесса, чем наmultiprocessing пакет.Это дает вам способ запустить дочерний процесс, выполняющий определенный исполняемый файл, с определенными аргументами и т. Д. Он не предоставляет высокоуровневый API для запуска определенной функции Python в другом процессе.Тем не менее, это не так сложно построить такую ​​вещь (по крайней мере, для конкретного случая).Рассмотрим следующий подход:

from sys import executable
from os import environ

from twisted.internet import reactor

implementation = """\
from yourapp import somefunction
somefunction()
"""

reactor.spawnProcess(executable, [executable, "-c", implementation], env=environ)
reactor.run()

Это просто запускает новый интерпретатор Python (какой бы он ни выполнялся) и использует параметр -c, чтобы указать программу в командной строке для запуска.

...