соглашение для представления статуса выхода и фактического результата в XMLRPC - PullRequest
0 голосов
/ 07 февраля 2010

в мире Си, функция может возвращать код ошибки для представления состояния выхода и использовать параметр INOUT / OUT для получения фактического результата процесса. когда дело доходит до xmlrpc, без параметра INOUT / OUT, есть ли лучшие практики / соглашения для представления статуса выхода и фактического результата?

в контексте я пытаюсь написать агент / демон (python SimpleXMLRPCServer), работающий на сервере, и хочу разработать «протокол» для взаимодействия с ним.

приветствуется любой совет.

EDIT : согласно комментарию С. Лотта, проясните проблему.

  • это скорее о соглашении ОС скорее чем С конвенция. Я согласен с этим.

  • Задача агента - более или менее запустить несколько cmd на сервере, по своей сути с идиомой код выхода / результат

.

Ответы [ 2 ]

1 голос
/ 08 февраля 2010

"в мире C, функция может возвращать код ошибки для представления статуса выхода и использовать параметр INOUT / OUT, чтобы получить реальный результат процесса"

  1. Считать статус выхода взломанным. Это не C-ism, это Linux-ism. Функции C возвращают ровно одно значение. C не имеет исключений, поэтому есть несколько способов указать на неудачу, все довольно плохо.

    Требуется обработка исключений. У Python и Java это есть, и им не нужен статус выхода.

    Однако ОС по-прежнему зависят от состояния выхода, поскольку сценарии оболочки по-прежнему очень примитивны, и некоторые языки (например, C) не могут выдавать исключения.

  2. Считать входные / выходные переменные также хаком Это ужасный взлом, потому что функция имеет несколько побочных эффектов в дополнение к возвращению значения.

Обе эти "особенности" не являются действительно лучшими шаблонами проектирования для подражания.

В идеале, функция является «идемпотентной» - независимо от того, сколько раз вы ее вызываете, вы получаете одинаковые результаты. Переменные In / Out нарушают идемпотентность непонятными, трудными для отладки способами.

Вам не нужны ни одна из этих функций, поэтому вы не видите много лучших практик для их реализации.

Лучше всего возвращать значение или вызывать исключение. Если вам нужно вернуть несколько значений, вы вернете кортеж. Если что-то не работает, вы не возвращаете статус выхода, вы вызываете исключение.


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

Вам нужно подражать: http://linux.die.net/man/1/remctl точно. Вы должны написать клиент и сервер Python. Сервер возвращает сообщение с кодом состояния (и любой другой сводкой, например, во время выполнения). Клиент выходит с тем же кодом состояния.

1 голос
/ 07 февраля 2010

Один простой способ реализовать это в Python - это кортеж. Пусть ваша функция вернет кортеж: (status, result), где статус может быть числовым или строковым, а результатом может быть любая структура данных Python, которую вы любите.

Вот пример, адаптированный из документации модуля. Код сервера:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler

# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# Create server
server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)

def myfunction(x, y):
    status = 1
    result = [5, 6, [4, 5]]
    return (status, result)
server.register_function(myfunction)

# Run the server's main loop
server.serve_forever()

Код клиента:

import xmlrpclib

s = xmlrpclib.ServerProxy('http://localhost:8000')
print s.myfunction(2, 4)

Функция сервера возвращает кортеж

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...