2010-02-07 1 views
0

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

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

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

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

  • больше о зева конвенции, а , чем C конвенции. Я согласен с этим.

  • работа агенты является более или менее запустить некоторый ЦМД на сервере, по своей сути с кодом выхода/результат идиомой

.

ответ

1

Один простой способ реализовать это в Python с кортежем. Пусть ваша функция возвращает кортеж: (статус, результат), где статус может быть числовым или строковым, а результатом может быть любая структура данных 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) 

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

+0

Я начну с этого и реорганизую позже, если это необходимо. Thanx. –

1

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

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

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

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

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

Обе эти «функции» на самом деле не лучшие образцы дизайна.

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

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

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


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

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

+0

Ответ вы проницательный. Проблема здесь в том, что работа агента более или менее запускает некоторый cmd на сервере, по сути, с идентификатором кода выхода/результата. переопределять Исключения для всех этих вещей не так практичны. –

+0

@ Dyno Fu: обновите свой вопрос, чтобы сообщить об этом. Поскольку вы используете команду (используя соглашения OS), вы должны упаковать результаты ОС. Код состояния из команд ОС абсолютно не имеет ничего общего с функциями C или аргументами ввода/вывода. Ваш вопрос и этот комментарий почти не имеют никакого отношения друг к другу. Пожалуйста, исправьте свой вопрос или удалите этот комментарий. –

+0

хорошо, у вас есть своя точка. возможно, я попытался свести проблему с ошибкой. (код выхода и результат в результате) –