Comments 2
while True:
with Listener(daemon) as listener:
...
Сервер должен быть активен всегда, поэтому я запускаю его в бесконечном цикле.
И поэтому он постоянно открывает-закрывает сокет после каждого сообщения? Не лучше ли поменять строки местами?
if request["method"] == "hello":
response = api.hello(request)
with Client(cli) as conn:
conn.send(response)
Я понимаю что это демо-пример, вырванный из работающей программы, но очень режет взгляд работа с возможно неинициализированной переменной.
Я правильно понимаю что архитектурно не предусмотрена работа "сервера" с более чем одним "клиентом"?
В вашем реальном коммерческом приложении, конечно же, реализована какая-то схема безопасности? Иначе в чем разница между запуском скрипта просто от имени суперпользователя?
Начну с конца.
По поводу безопасности: в моем приложении реализована аутентификация клиента по hmac. В статье этого нет, потому что на тот момент не было и в коде. Если интересно, подробности есть в документации: https://docs.python.org/3/library/multiprocessing.html#authentication-keys
По поводу архитектуры: насколько я понимаю, опять же, из документации, сервер — многопроцессорный из коробки. То есть, для сервера не имеет значения сколько к нему обращается «клиентов», для него это все выглядит как просто запросы от процессов по IPC. При этом, серверу, чтобы обслужить запрос, достаточно чтобы у клиентского процесса (который обращается к нему в данный момент времени) совпал ключ аутентификации (если она используется).
Касательно конкретно моей архитектуры: мне не нужно много процессов — один сервер в руте и управляющий процесс на стороне пользователя. Однако это не мешает расширить функциональность до многопроцессорности, только реализация обработки запросов по API при этом изменится.
Вы правы — даже мой линтер жаловался на Unbound Variable. И с контекстным менеджером тоже глупо получилось.
Спасибо за замечания.
Клиент-серверный IPC на Python multiprocessing